CodeCompleteConsumer.cpp revision 87c08a5d6b9e1e44ae6f554df40139d3a6f60b33
1ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===// 2ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj// 3752f90673ebbb6b2f55fc5e46606dea371313713sewardj// The LLVM Compiler Infrastructure 4ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj// 5ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj// This file is distributed under the University of Illinois Open Source 6f8ed9d874a7b8651654591c68c6d431c758d787csewardj// License. See LICENSE.TXT for details. 7752f90673ebbb6b2f55fc5e46606dea371313713sewardj// 8752f90673ebbb6b2f55fc5e46606dea371313713sewardj//===----------------------------------------------------------------------===// 9f8ed9d874a7b8651654591c68c6d431c758d787csewardj// 10752f90673ebbb6b2f55fc5e46606dea371313713sewardj// This file implements the CodeCompleteConsumer class. 11752f90673ebbb6b2f55fc5e46606dea371313713sewardj// 127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj//===----------------------------------------------------------------------===// 13752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Sema/CodeCompleteConsumer.h" 14752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Sema/Sema.h" 15752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/AST/DeclCXX.h" 16752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Parse/Scope.h" 177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj#include "clang/Lex/Preprocessor.h" 18752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang-c/Index.h" 19752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "llvm/ADT/STLExtras.h" 20752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "llvm/Support/raw_ostream.h" 21752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <algorithm> 22752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <cstring> 23752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <functional> 24752f90673ebbb6b2f55fc5e46606dea371313713sewardj 25752f90673ebbb6b2f55fc5e46606dea371313713sewardjusing namespace clang; 267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardjusing llvm::StringRef; 277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 28752f90673ebbb6b2f55fc5e46606dea371313713sewardj//===----------------------------------------------------------------------===// 29f8ed9d874a7b8651654591c68c6d431c758d787csewardj// Code completion string implementation 30f8ed9d874a7b8651654591c68c6d431c758d787csewardj//===----------------------------------------------------------------------===// 31f8ed9d874a7b8651654591c68c6d431c758d787csewardjCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text) 32f8ed9d874a7b8651654591c68c6d431c758d787csewardj : Kind(Kind), Text("") 33f8ed9d874a7b8651654591c68c6d431c758d787csewardj{ 34f8ed9d874a7b8651654591c68c6d431c758d787csewardj switch (Kind) { 35f8ed9d874a7b8651654591c68c6d431c758d787csewardj case CK_TypedText: 36887a11a609f3e61d2ae8fe4e67f176207715da7esewardj case CK_Text: 37887a11a609f3e61d2ae8fe4e67f176207715da7esewardj case CK_Placeholder: 38ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj case CK_Informative: 39887a11a609f3e61d2ae8fe4e67f176207715da7esewardj case CK_ResultType: 40ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj case CK_CurrentParameter: { 4157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj char *New = new char [Text.size() + 1]; 42ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj std::memcpy(New, Text.data(), Text.size()); 4357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj New[Text.size()] = '\0'; 4457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = New; 4557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 4657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 4757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 4857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Optional: 4957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj llvm_unreachable("Optional strings cannot be created from text"); 5057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 5157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 5257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftParen: 53dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj this->Text = "("; 54dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj break; 55dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj 56dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_RightParen: 5757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = ")"; 58dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj break; 5957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 60dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_LeftBracket: 6157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = "["; 62dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj break; 63dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj 64dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_RightBracket: 65dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj this->Text = "]"; 6657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 6757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 6857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftBrace: 6957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = "{"; 7057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 7157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 7257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightBrace: 7357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = "}"; 7457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 7557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 7657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftAngle: 7757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = "<"; 7857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 7957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 8057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightAngle: 8157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = ">"; 8257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 8357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 8457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Comma: 8557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = ", "; 8657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 8757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 8857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Colon: 8957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = ":"; 9057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 9157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 9257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_SemiColon: 93dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj this->Text = ";"; 94dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj break; 95dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj 96dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_Equal: 97dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj this->Text = " = "; 9857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 9957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 10057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_HorizontalSpace: 10157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = " "; 10257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 10357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 10457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_VerticalSpace: 10557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj this->Text = "\n"; 10657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 1072f10aa6f4e9ea78030c46cce9b073b19c63c0f60sewardj } 10857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 10957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 11057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 11157c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateText(StringRef Text) { 11257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(CK_Text, Text); 11357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 11457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 11557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 11657c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateOptional( 11757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj std::auto_ptr<CodeCompletionString> Optional) { 11857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj Chunk Result; 11957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj Result.Kind = CK_Optional; 12057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj Result.Optional = Optional.release(); 12157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Result; 12257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 12357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 12457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 12557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) { 12657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(CK_Placeholder, Placeholder); 12757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 12857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 12957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 13057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateInformative(StringRef Informative) { 13157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(CK_Informative, Informative); 13257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 13357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 13457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 13557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateResultType(StringRef ResultType) { 13657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(CK_ResultType, ResultType); 13757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 13857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 13957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk 14057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateCurrentParameter( 14157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj StringRef CurrentParameter) { 14257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(CK_CurrentParameter, CurrentParameter); 14357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 14457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 14557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const { 14657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj switch (Kind) { 14757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_TypedText: 14857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Text: 14957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Placeholder: 1502f10aa6f4e9ea78030c46cce9b073b19c63c0f60sewardj case CK_Informative: 15157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_ResultType: 15257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_CurrentParameter: 15357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftParen: 15457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightParen: 15557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftBracket: 15657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightBracket: 15757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftBrace: 15857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightBrace: 15957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftAngle: 16057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightAngle: 16157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Comma: 16257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Colon: 16357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_SemiColon: 16457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Equal: 16557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_HorizontalSpace: 16657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_VerticalSpace: 16757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(Kind, Text); 16857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 16957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Optional: { 170dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj std::auto_ptr<CodeCompletionString> Opt(Optional->Clone()); 17157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return CreateOptional(Opt); 17257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 17357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 17457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 17557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj // Silence GCC warning. 17657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return Chunk(); 17757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 17857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 17957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjvoid 18057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::Destroy() { 18157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj switch (Kind) { 18257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Optional: 18357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj delete Optional; 18457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 18557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 18657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_TypedText: 18757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Text: 188ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj case CK_Placeholder: 189ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj case CK_Informative: 190ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj case CK_ResultType: 191496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_CurrentParameter: 192496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj delete [] Text; 193496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj break; 194496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj 195496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_LeftParen: 196496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_RightParen: 197496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_LeftBracket: 198496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_RightBracket: 199496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_LeftBrace: 200496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_RightBrace: 201496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_LeftAngle: 202496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_RightAngle: 203496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_Comma: 204dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_Colon: 205496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_SemiColon: 206f6c8ebf1294fea43756683ba7089b746168abb8esewardj case CK_Equal: 207f6c8ebf1294fea43756683ba7089b746168abb8esewardj case CK_HorizontalSpace: 208496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj case CK_VerticalSpace: 209dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj break; 210496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj } 211f6c8ebf1294fea43756683ba7089b746168abb8esewardj} 212f6c8ebf1294fea43756683ba7089b746168abb8esewardj 213496a58d130a28ac3a5ba33c9012dabbe61dc852csewardjvoid CodeCompletionString::clear() { 214496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj std::for_each(Chunks.begin(), Chunks.end(), 215c97096c44637ae5775ed305b19f16f0b505f17d8sewardj std::mem_fun_ref(&Chunk::Destroy)); 216e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj Chunks.clear(); 21757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 21857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 219e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardjstd::string CodeCompletionString::getAsString() const { 220c9a43665879a03886b27a65b68af2a2c11b04f59sewardj std::string Result; 221c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj llvm::raw_string_ostream OS(Result); 222c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj 223c9a43665879a03886b27a65b68af2a2c11b04f59sewardj for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 224c9a43665879a03886b27a65b68af2a2c11b04f59sewardj switch (C->Kind) { 225c9a43665879a03886b27a65b68af2a2c11b04f59sewardj case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 226c9a43665879a03886b27a65b68af2a2c11b04f59sewardj case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 2279b96767debeeb1f78378f0e7e295fe6762c64002sewardj 228c9a43665879a03886b27a65b68af2a2c11b04f59sewardj case CK_Informative: 229c9a43665879a03886b27a65b68af2a2c11b04f59sewardj case CK_ResultType: 2302019a976f07ff418dde2dfc7cc74667ef66d7764sewardj OS << "[#" << C->Text << "#]"; 231c9a43665879a03886b27a65b68af2a2c11b04f59sewardj break; 232d1725d18b61bf7912a9099686179faef5815dba1sewardj 233e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 234e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj default: OS << C->Text; break; 23557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 23635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj } 23757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return OS.str(); 23857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 23957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 240c97096c44637ae5775ed305b19f16f0b505f17d8sewardjconst char *CodeCompletionString::getTypedText() const { 241e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 242af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj if (C->Kind == CK_TypedText) 243af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj return C->Text; 24457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 245af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj return 0; 246af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj} 247c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj 248c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardjCodeCompletionString * 249af1cecaf9c96f99381dda16f41d286fc3e4d220asewardjCodeCompletionString::Clone(CodeCompletionString *Result) const { 250af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj if (!Result) 251af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj Result = new CodeCompletionString; 252af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 253c97096c44637ae5775ed305b19f16f0b505f17d8sewardj Result->AddChunk(C->Clone()); 254ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj return Result; 25557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 25657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 25757c10c89904f7fdc4244fcbf704625e7169aafe6sewardjstatic void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) { 258ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj OS.write((const char *)&Value, sizeof(unsigned)); 259c9a43665879a03886b27a65b68af2a2c11b04f59sewardj} 260c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj 261c9a43665879a03886b27a65b68af2a2c11b04f59sewardjstatic bool ReadUnsigned(const char *&Memory, const char *MemoryEnd, 262c9a43665879a03886b27a65b68af2a2c11b04f59sewardj unsigned &Value) { 263c9a43665879a03886b27a65b68af2a2c11b04f59sewardj if (Memory + sizeof(unsigned) > MemoryEnd) 264c9a43665879a03886b27a65b68af2a2c11b04f59sewardj return true; 2652019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 2662019a976f07ff418dde2dfc7cc74667ef66d7764sewardj memmove(&Value, Memory, sizeof(unsigned)); 2672019a976f07ff418dde2dfc7cc74667ef66d7764sewardj Memory += sizeof(unsigned); 2681e6ad745ebafd0524da1da27a4b85524fa84f777sewardj return false; 2691e6ad745ebafd0524da1da27a4b85524fa84f777sewardj} 2701e6ad745ebafd0524da1da27a4b85524fa84f777sewardj 27157c10c89904f7fdc4244fcbf704625e7169aafe6sewardjvoid CodeCompletionString::Serialize(llvm::raw_ostream &OS) const { 27257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj // Write the number of chunks. 273207557ab2ea38239b670785c976b89d50bbb0eccsewardj WriteUnsigned(OS, size()); 274ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj 275ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 27657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj WriteUnsigned(OS, C->Kind); 27757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 27857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj switch (C->Kind) { 27957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_TypedText: 280ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj case CK_Text: 281e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj case CK_Placeholder: 282ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj case CK_Informative: 283ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj case CK_ResultType: 284ba99931f6dfa264d7bc7c3845a46fc955ab56d93sewardj case CK_CurrentParameter: { 285c97096c44637ae5775ed305b19f16f0b505f17d8sewardj const char *Text = C->Text; 286c97096c44637ae5775ed305b19f16f0b505f17d8sewardj unsigned StrLen = strlen(Text); 287c97096c44637ae5775ed305b19f16f0b505f17d8sewardj WriteUnsigned(OS, StrLen); 288c97096c44637ae5775ed305b19f16f0b505f17d8sewardj OS.write(Text, StrLen); 2892019a976f07ff418dde2dfc7cc74667ef66d7764sewardj break; 2902019a976f07ff418dde2dfc7cc74667ef66d7764sewardj } 291a58ea668d4725b87a146cf43cc48b8ea6ead84casewardj 29217442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_Optional: 29357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj C->Optional->Serialize(OS); 294ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj break; 295ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj 296ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj case CK_LeftParen: 297ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj case CK_RightParen: 29857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftBracket: 299ba99931f6dfa264d7bc7c3845a46fc955ab56d93sewardj case CK_RightBracket: 30017442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_LeftBrace: 30117442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_RightBrace: 30217442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_LeftAngle: 30317442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_RightAngle: 3042019a976f07ff418dde2dfc7cc74667ef66d7764sewardj case CK_Comma: 3052019a976f07ff418dde2dfc7cc74667ef66d7764sewardj case CK_Colon: 30617442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_SemiColon: 30717442fe8094d0f82266e5a05509f62cac8f7539esewardj case CK_Equal: 3081e6ad745ebafd0524da1da27a4b85524fa84f777sewardj case CK_HorizontalSpace: 309c97096c44637ae5775ed305b19f16f0b505f17d8sewardj case CK_VerticalSpace: 31057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 311dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj } 312695cff9303ef5dc8079117acfd632b44edb1f010sewardj } 31357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 31435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 31557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjbool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) { 31657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj if (Str == StrEnd || *Str == 0) 3174345f7a3ecee1dde39b3c9b58372a5af97a06e8csewardj return false; 318ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj 319c97096c44637ae5775ed305b19f16f0b505f17d8sewardj unsigned NumBlocks; 3208ea867b06de73d909c29e243407713c291c8414esewardj if (ReadUnsigned(Str, StrEnd, NumBlocks)) 3218ea867b06de73d909c29e243407713c291c8414esewardj return false; 3228ea867b06de73d909c29e243407713c291c8414esewardj 32377352545d8416a36a4e6310aaea6b0205508aea2sewardj for (unsigned I = 0; I != NumBlocks; ++I) { 3248ea867b06de73d909c29e243407713c291c8414esewardj if (Str + 1 >= StrEnd) 32503d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj break; 32603d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj 32703d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj // Parse the next kind. 32803d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj unsigned KindValue; 32943c56461a667ca81fe29f1db01450d6ff1d62949sewardj if (ReadUnsigned(Str, StrEnd, KindValue)) 33043c56461a667ca81fe29f1db01450d6ff1d62949sewardj return false; 33143c56461a667ca81fe29f1db01450d6ff1d62949sewardj 33243c56461a667ca81fe29f1db01450d6ff1d62949sewardj switch (ChunkKind Kind = (ChunkKind)KindValue) { 33343c56461a667ca81fe29f1db01450d6ff1d62949sewardj case CK_TypedText: 33443c56461a667ca81fe29f1db01450d6ff1d62949sewardj case CK_Text: 33543c56461a667ca81fe29f1db01450d6ff1d62949sewardj case CK_Placeholder: 3368ea867b06de73d909c29e243407713c291c8414esewardj case CK_Informative: 3378ea867b06de73d909c29e243407713c291c8414esewardj case CK_ResultType: 3388ea867b06de73d909c29e243407713c291c8414esewardj case CK_CurrentParameter: { 3392d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj unsigned StrLen; 3402d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd)) 3412d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj return false; 3422d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj 3438ea867b06de73d909c29e243407713c291c8414esewardj AddChunk(Chunk(Kind, StringRef(Str, StrLen))); 3448ea867b06de73d909c29e243407713c291c8414esewardj Str += StrLen; 3458ea867b06de73d909c29e243407713c291c8414esewardj break; 34657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 3472d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj 3488ea867b06de73d909c29e243407713c291c8414esewardj case CK_Optional: { 34957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString()); 350dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj if (Optional->Deserialize(Str, StrEnd)) 3518ea867b06de73d909c29e243407713c291c8414esewardj AddOptionalChunk(Optional); 35257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj break; 3538ea867b06de73d909c29e243407713c291c8414esewardj } 3548ea867b06de73d909c29e243407713c291c8414esewardj 3558ea867b06de73d909c29e243407713c291c8414esewardj case CK_LeftParen: 3562d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_RightParen: 3572d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_LeftBracket: 35857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightBracket: 35957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_LeftBrace: 36057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_RightBrace: 3612d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_LeftAngle: 3622d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_RightAngle: 36357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Comma: 36457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_Colon: 36557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj case CK_SemiColon: 3662d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_Equal: 367dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj case CK_HorizontalSpace: 3682d3f77c12d2911173fd182d0b6e954196dee9135sewardj case CK_VerticalSpace: 369dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj AddChunk(Chunk(Kind)); 3702d3f77c12d2911173fd182d0b6e954196dee9135sewardj break; 371dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj } 372695cff9303ef5dc8079117acfd632b44edb1f010sewardj }; 373dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj 374dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj return true; 3752d3f77c12d2911173fd182d0b6e954196dee9135sewardj} 3762d3f77c12d2911173fd182d0b6e954196dee9135sewardj 377c97096c44637ae5775ed305b19f16f0b505f17d8sewardjvoid CodeCompleteConsumer::Result::Destroy() { 378ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj if (Kind == RK_Pattern) { 37957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj delete Pattern; 38057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj Pattern = 0; 38157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj } 382fbcaf3312f39fb73d54821636c6168db76245f61sewardj} 383ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj 38457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjunsigned CodeCompleteConsumer::Result::getPriorityFromDecl(NamedDecl *ND) { 38535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj if (!ND) 386c97096c44637ae5775ed305b19f16f0b505f17d8sewardj return CCP_Unlikely; 38792d168d0f2a985ed9f7ae4e6bba9565a13921b31sewardj 388fbcaf3312f39fb73d54821636c6168db76245f61sewardj // Context-based decisions. 389ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj DeclContext *DC = ND->getDeclContext()->getLookupContext(); 39040c802659108a96bb87cbc1a30b7b77e2abd0829sewardj if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) 391ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj return CCP_LocalDeclaration; 39257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 39357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return CCP_MemberDeclaration; 39457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 39557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj // Content-based decisions. 39657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj if (isa<EnumConstantDecl>(ND)) 39757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return CCP_Constant; 39857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 39957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return CCP_Type; 40057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj return CCP_Declaration; 40157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj} 402ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj 40341f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj//===----------------------------------------------------------------------===// 40471a35e7351fc1202ef2960d3f0315d9181624fe2sewardj// Code completion overload candidate implementation 40571a35e7351fc1202ef2960d3f0315d9181624fe2sewardj//===----------------------------------------------------------------------===// 40671a35e7351fc1202ef2960d3f0315d9181624fe2sewardjFunctionDecl * 407c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardjCodeCompleteConsumer::OverloadCandidate::getFunction() const { 40866de22767fc526eff52133c18d4a42a9b25d5f18sewardj if (getKind() == CK_Function) 40941f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj return Function; 41041f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj else if (getKind() == CK_FunctionTemplate) 41141f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj return FunctionTemplate->getTemplatedDecl(); 41241f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj else 41341f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj return 0; 41441f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj} 41541f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj 41641f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardjconst FunctionType * 41741f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardjCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 418e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj switch (Kind) { 419e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj case CK_Function: 420e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj return Function->getType()->getAs<FunctionType>(); 42141f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj 42241f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj case CK_FunctionTemplate: 42371a35e7351fc1202ef2960d3f0315d9181624fe2sewardj return FunctionTemplate->getTemplatedDecl()->getType() 4241fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj ->getAs<FunctionType>(); 4251fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj 4261fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj case CK_FunctionType: 4271fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj return Type; 4281fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj } 4291fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj 4301fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj return 0; 4311fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj} 43271a35e7351fc1202ef2960d3f0315d9181624fe2sewardj 43371a35e7351fc1202ef2960d3f0315d9181624fe2sewardj//===----------------------------------------------------------------------===// 4349690d927540d730525a5f7f14663f3ceaa7818dasewardj// Code completion consumer implementation 4359b96767debeeb1f78378f0e7e295fe6762c64002sewardj//===----------------------------------------------------------------------===// 4369b96767debeeb1f78378f0e7e295fe6762c64002sewardj 4378f3debf52b76a050bc84997a0358c4aa86dfc88dsewardjCodeCompleteConsumer::~CodeCompleteConsumer() { } 438ce646f23d71ac432c340667387aa4a5ce7d18099sewardj 439f53b7359a342e7d79090615169c6583a1a75fbcesewardjvoid 440f53b7359a342e7d79090615169c6583a1a75fbcesewardjPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 441f53b7359a342e7d79090615169c6583a1a75fbcesewardj CodeCompletionContext Context, 442f53b7359a342e7d79090615169c6583a1a75fbcesewardj Result *Results, 4438f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj unsigned NumResults) { 4448f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj // Print the results. 445b51f0f4f33256638ed953156a2635aa739b232f1sewardj for (unsigned I = 0; I != NumResults; ++I) { 4469854007808ab24cad3f971eab63face1cb1e6089sewardj OS << "COMPLETION: "; 4479854007808ab24cad3f971eab63face1cb1e6089sewardj switch (Results[I].Kind) { 4489854007808ab24cad3f971eab63face1cb1e6089sewardj case Result::RK_Declaration: 4499854007808ab24cad3f971eab63face1cb1e6089sewardj OS << Results[I].Declaration; 450343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj if (Results[I].Hidden) 4510033ddccac6f90789fe2e78e86b8a649931d77b4sewardj OS << " (Hidden)"; 4520033ddccac6f90789fe2e78e86b8a649931d77b4sewardj if (CodeCompletionString *CCS 453eb17e49565dd7867a56c8ba6e45fdca01a576bb3sewardj = Results[I].CreateCodeCompletionString(SemaRef)) { 454eb17e49565dd7867a56c8ba6e45fdca01a576bb3sewardj OS << " : " << CCS->getAsString(); 455478646f54befaba01cbceb40fd5e46cdf562fdb5sewardj delete CCS; 4560033ddccac6f90789fe2e78e86b8a649931d77b4sewardj } 45757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj 45857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj OS << '\n'; 459b51f0f4f33256638ed953156a2635aa739b232f1sewardj break; 460b51f0f4f33256638ed953156a2635aa739b232f1sewardj 461b51f0f4f33256638ed953156a2635aa739b232f1sewardj case Result::RK_Keyword: 462b51f0f4f33256638ed953156a2635aa739b232f1sewardj OS << Results[I].Keyword << '\n'; 4632831b00c4950d6c2b061def05fd67528fe132ececerion break; 4642831b00c4950d6c2b061def05fd67528fe132ececerion 465b51f0f4f33256638ed953156a2635aa739b232f1sewardj case Result::RK_Macro: { 4669690d927540d730525a5f7f14663f3ceaa7818dasewardj OS << Results[I].Macro->getName(); 4678f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj if (CodeCompletionString *CCS 4685c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion = Results[I].CreateCodeCompletionString(SemaRef)) { 4695c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion OS << " : " << CCS->getAsString(); 470f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion delete CCS; 471f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion } 472e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj OS << '\n'; 473e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj break; 4744aa412af1d8166cc11f39a6e721df49431d23618sewardj } 475e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj 4765c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion case Result::RK_Pattern: { 4779690d927540d730525a5f7f14663f3ceaa7818dasewardj OS << "Pattern : " 4789690d927540d730525a5f7f14663f3ceaa7818dasewardj << Results[I].Pattern->getAsString() << '\n'; 4799690d927540d730525a5f7f14663f3ceaa7818dasewardj break; 48089d4e9828ce36532c957566ebb46947109a7b53dsewardj } 481343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj } 482343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj } 483343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj} 484343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj 4852019a976f07ff418dde2dfc7cc74667ef66d7764sewardjvoid 4862019a976f07ff418dde2dfc7cc74667ef66d7764sewardjPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 4872019a976f07ff418dde2dfc7cc74667ef66d7764sewardj unsigned CurrentArg, 4880033ddccac6f90789fe2e78e86b8a649931d77b4sewardj OverloadCandidate *Candidates, 4890033ddccac6f90789fe2e78e86b8a649931d77b4sewardj unsigned NumCandidates) { 4900033ddccac6f90789fe2e78e86b8a649931d77b4sewardj for (unsigned I = 0; I != NumCandidates; ++I) { 4910033ddccac6f90789fe2e78e86b8a649931d77b4sewardj if (CodeCompletionString *CCS 4920033ddccac6f90789fe2e78e86b8a649931d77b4sewardj = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) { 4939690d927540d730525a5f7f14663f3ceaa7818dasewardj OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 4940033ddccac6f90789fe2e78e86b8a649931d77b4sewardj delete CCS; 4950033ddccac6f90789fe2e78e86b8a649931d77b4sewardj } 4960033ddccac6f90789fe2e78e86b8a649931d77b4sewardj } 4970033ddccac6f90789fe2e78e86b8a649931d77b4sewardj} 4980033ddccac6f90789fe2e78e86b8a649931d77b4sewardj 4990033ddccac6f90789fe2e78e86b8a649931d77b4sewardjvoid CodeCompleteConsumer::Result::computeCursorKind() { 5000033ddccac6f90789fe2e78e86b8a649931d77b4sewardj switch (Kind) { 501a238471814bd386aeb58a76718b41e68b1a794b2sewardj case RK_Declaration: 5020033ddccac6f90789fe2e78e86b8a649931d77b4sewardj switch (Declaration->getKind()) { 503b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj case Decl::Record: 504b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj case Decl::CXXRecord: 505b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj case Decl::ClassTemplateSpecialization: { 506b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj RecordDecl *Record = cast<RecordDecl>(Declaration); 5078c7f1abe9e022f6382634efea09c9cac89ec6336sewardj if (Record->isStruct()) 5088c7f1abe9e022f6382634efea09c9cac89ec6336sewardj CursorKind = CXCursor_StructDecl; 5098c7f1abe9e022f6382634efea09c9cac89ec6336sewardj else if (Record->isUnion()) 5108c7f1abe9e022f6382634efea09c9cac89ec6336sewardj CursorKind = CXCursor_UnionDecl; 5119690d927540d730525a5f7f14663f3ceaa7818dasewardj else 5128c7f1abe9e022f6382634efea09c9cac89ec6336sewardj CursorKind = CXCursor_ClassDecl; 5139690d927540d730525a5f7f14663f3ceaa7818dasewardj break; 5149690d927540d730525a5f7f14663f3ceaa7818dasewardj } 5159b96767debeeb1f78378f0e7e295fe6762c64002sewardj 5169b96767debeeb1f78378f0e7e295fe6762c64002sewardj case Decl::ObjCMethod: { 5179b96767debeeb1f78378f0e7e295fe6762c64002sewardj ObjCMethodDecl *Method = cast<ObjCMethodDecl>(Declaration); 5189b96767debeeb1f78378f0e7e295fe6762c64002sewardj if (Method->isInstanceMethod()) 519cf780b4c356a274cc48a6829963f8bc79a1b34e8sewardj CursorKind = CXCursor_ObjCInstanceMethodDecl; 5206e797c5fbd90ecc6531f9d8c4929848664a13714sewardj else 52184ff0657940e62f38e618ea18bac6f27ce0e741fsewardj CursorKind = CXCursor_ObjCClassMethodDecl; 522291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj break; 523291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj } 52484ff0657940e62f38e618ea18bac6f27ce0e741fsewardj 525291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj case Decl::Typedef: 526fd33277c458b31596eb4fb15959467ac047c75dasewardj CursorKind = CXCursor_TypedefDecl; 5278eda6304ecfaa1d0aa70773a2c07f996717f8f54sewardj break; 528cf7879021370aabcccb1a9347244fcc7d5680141sewardj 529b5874aa03bb38bf754aa8c1cb1e400f3d7e86b9fsewardj case Decl::Enum: 5308f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_EnumDecl; 531baf971ad7f6e005109f3301ec9d19c98066b3840sewardj break; 5328f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 533b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::Field: 534cfded9ab7c059881ecdbe967ddfcc1ce207986casewardj CursorKind = CXCursor_FieldDecl; 535b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj break; 536b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj 537b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::EnumConstant: 53852ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj CursorKind = CXCursor_EnumConstantDecl; 5396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Decl::Function: 542b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::CXXMethod: 543b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::CXXConstructor: 544b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::CXXDestructor: 545b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::CXXConversion: 54652ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj CursorKind = CXCursor_FunctionDecl; 547b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj break; 548b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj 549b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj case Decl::Var: 5508f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_VarDecl; 5516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Decl::ParmVar: 554b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj CursorKind = CXCursor_ParmDecl; 555b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj break; 556b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj 557baf971ad7f6e005109f3301ec9d19c98066b3840sewardj case Decl::ObjCInterface: 5586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CursorKind = CXCursor_ObjCInterfaceDecl; 5596c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5618f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj case Decl::ObjCCategory: 562883b00b3d97a9873371557d7b1f2ac5db7985e43sewardj CursorKind = CXCursor_ObjCCategoryDecl; 5638f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 5648f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 565883b00b3d97a9873371557d7b1f2ac5db7985e43sewardj case Decl::ObjCProtocol: 5668f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_ObjCProtocolDecl; 5678f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 5688f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 5696c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Decl::ObjCProperty: 5708f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_ObjCPropertyDecl; 5712019a976f07ff418dde2dfc7cc74667ef66d7764sewardj break; 5722019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 5738f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj case Decl::ObjCIvar: 5743bca906f6e715c544eb49c278bedef093c14c0d7sewardj CursorKind = CXCursor_ObjCIvarDecl; 575b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj break; 5766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5776c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Decl::ObjCImplementation: 5786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CursorKind = CXCursor_ObjCImplementationDecl; 5796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5808f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 5818f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj case Decl::ObjCCategoryImpl: 5828f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_ObjCCategoryImplDecl; 5838f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 5848f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 5858f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj default: 5868f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CursorKind = CXCursor_NotImplemented; 5878f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 5888f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj } 5898f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 5908f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj 5916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Result::RK_Macro: 5926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CursorKind = CXCursor_MacroDefinition; 5936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5946c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Result::RK_Keyword: 5966c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CursorKind = CXCursor_NotImplemented; 5976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 5996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case Result::RK_Pattern: 6008f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj // Do nothing: Patterns can come with cursor kinds! 6018f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj break; 6028f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj } 6036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj} 6046c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 6056c299f3acab617581ea504e45fbb6cab24c2b29fsewardjvoid 6066c299f3acab617581ea504e45fbb6cab24c2b29fsewardjCIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 6076c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CodeCompletionContext Context, 6086c299f3acab617581ea504e45fbb6cab24c2b29fsewardj Result *Results, 6096c299f3acab617581ea504e45fbb6cab24c2b29fsewardj unsigned NumResults) { 6106c299f3acab617581ea504e45fbb6cab24c2b29fsewardj // Print the results. 6113bca906f6e715c544eb49c278bedef093c14c0d7sewardj for (unsigned I = 0; I != NumResults; ++I) { 6123bca906f6e715c544eb49c278bedef093c14c0d7sewardj WriteUnsigned(OS, Results[I].CursorKind); 6133bca906f6e715c544eb49c278bedef093c14c0d7sewardj WriteUnsigned(OS, Results[I].Priority); 6148f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef); 6156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj assert(CCS && "No code-completion string?"); 6166c299f3acab617581ea504e45fbb6cab24c2b29fsewardj CCS->Serialize(OS); 6176c299f3acab617581ea504e45fbb6cab24c2b29fsewardj delete CCS; 6184aa412af1d8166cc11f39a6e721df49431d23618sewardj } 6196c299f3acab617581ea504e45fbb6cab24c2b29fsewardj} 6206c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 6216c299f3acab617581ea504e45fbb6cab24c2b29fsewardjvoid 6226c299f3acab617581ea504e45fbb6cab24c2b29fsewardjCIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 6236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj unsigned CurrentArg, 6246c299f3acab617581ea504e45fbb6cab24c2b29fsewardj OverloadCandidate *Candidates, 62566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj unsigned NumCandidates) { 62666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj for (unsigned I = 0; I != NumCandidates; ++I) { 62752ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj WriteUnsigned(OS, CXCursor_NotImplemented); 6286c299f3acab617581ea504e45fbb6cab24c2b29fsewardj WriteUnsigned(OS, /*Priority=*/0); 6293bca906f6e715c544eb49c278bedef093c14c0d7sewardj CodeCompletionString *CCS 6302019a976f07ff418dde2dfc7cc74667ef66d7764sewardj = Candidates[I].CreateSignatureString(CurrentArg, SemaRef); 6312019a976f07ff418dde2dfc7cc74667ef66d7764sewardj assert(CCS && "No code-completion string?"); 6322019a976f07ff418dde2dfc7cc74667ef66d7764sewardj CCS->Serialize(OS); 6332019a976f07ff418dde2dfc7cc74667ef66d7764sewardj delete CCS; 6342019a976f07ff418dde2dfc7cc74667ef66d7764sewardj } 6352019a976f07ff418dde2dfc7cc74667ef66d7764sewardj} 6362019a976f07ff418dde2dfc7cc74667ef66d7764sewardj