CodeCompleteConsumer.cpp revision 2b4074f1d3919e77cb33ca49c960521dea27afab
186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===// 281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// The LLVM Compiler Infrastructure 481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file is distributed under the University of Illinois Open Source 681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// License. See LICENSE.TXT for details. 781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file implements the CodeCompleteConsumer class. 1181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 1381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 1475b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h" 15374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor#include "clang/Parse/Scope.h" 1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h" 172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor#include "clang-c/Index.h" 1881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "Sema.h" 1981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h" 200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor#include "llvm/ADT/StringSwitch.h" 2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h" 2281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm> 23e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring> 24e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional> 2592eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor 2681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 2792eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregorusing llvm::StringRef; 2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 29e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 30e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation 31e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text) 33ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar : Kind(Kind), Text("") 340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{ 350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (Kind) { 360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: { 410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor char *New = new char [Text.size() + 1]; 420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor std::memcpy(New, Text.data(), Text.size()); 430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor New[Text.size()] = '\0'; 440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = New; 450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Optional: 490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor llvm::llvm_unreachable("Optional strings cannot be created from text"); 500c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "("; 540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ")"; 580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "["; 620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "]"; 660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "{"; 700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "}"; 740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 760c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 770c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "<"; 780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 810c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ">"; 820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ", "; 860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 880563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 900563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 9192eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateText(StringRef Text) { 920563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Text, Text); 93e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 94e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 95e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 96e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::CreateOptional( 97e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::auto_ptr<CodeCompletionString> Optional) { 98e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Chunk Result; 99e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Kind = CK_Optional; 100e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Optional = Optional.release(); 101e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor return Result; 102e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 103e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 104e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 10592eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) { 1060563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Placeholder, Placeholder); 1070563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1080563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1090563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 11092eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateInformative(StringRef Informative) { 1110563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Informative, Informative); 112e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 113e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk 1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter( 11692eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor StringRef CurrentParameter) { 1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Chunk(CK_CurrentParameter, CurrentParameter); 1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 12054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas GregorCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const { 12154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor switch (Kind) { 12254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_TypedText: 12354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Text: 12454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Placeholder: 12554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Informative: 12654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_CurrentParameter: 12754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftParen: 12854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightParen: 12954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftBracket: 13054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightBracket: 13154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftBrace: 13254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightBrace: 13354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftAngle: 13454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightAngle: 13554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Comma: 13654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Chunk(Kind, Text); 13754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 13854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Optional: { 13954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor std::auto_ptr<CodeCompletionString> Opt(Optional->Clone()); 14054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return CreateOptional(Opt); 14154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 14254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 14354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 14454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor // Silence GCC warning. 14554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Chunk(); 14654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 1470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 148e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorvoid 149e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::Destroy() { 150e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (Kind) { 1510563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Optional: 1520563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor delete Optional; 1530563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor break; 1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 1560563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Text: 1570563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: 1580563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Informative: 1590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: 1600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor delete [] Text; 1610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 1640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 1650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 1660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 1670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 1680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 1690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 1700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 1710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor break; 173e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 174e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 175e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 176e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::~CodeCompletionString() { 177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::for_each(Chunks.begin(), Chunks.end(), 178e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::mem_fun_ref(&Chunk::Destroy)); 179e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 180e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 181e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const { 182e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::string Result; 183e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor llvm::raw_string_ostream OS(Result); 184e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 185e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 186e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (C->Kind) { 187e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 1880563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 1890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Informative: OS << "[#" << C->Text << "#]"; break; 1900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 1910c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor default: OS << C->Text; break; 192e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 193e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 194e2b7eea99c0e20fd4712e374c4094a957c236953Douglas Gregor OS.flush(); 195e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor return Result; 196e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 197e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 19854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const { 19954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 20054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (C->Kind == CK_TypedText) 20154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return C->Text; 20254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 20354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return 0; 20454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 20554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 20654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas GregorCodeCompletionString *CodeCompletionString::Clone() const { 20754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Result = new CodeCompletionString; 20854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 20954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Result->AddChunk(C->Clone()); 21054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Result; 21154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 2120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) { 2142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor OS.write((const char *)&Value, sizeof(unsigned)); 2152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor} 2160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic bool ReadUnsigned(const char *&Memory, const char *MemoryEnd, 2182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned &Value) { 2192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Memory + sizeof(unsigned) > MemoryEnd) 2202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return true; 2212b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor memmove(&Value, Memory, sizeof(unsigned)); 2232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Memory += sizeof(unsigned); 2242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return false; 2250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 2260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid CodeCompletionString::Serialize(llvm::raw_ostream &OS) const { 2282b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor // Write the number of chunks. 2292b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, size()); 2302b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 2322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, C->Kind); 2332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (C->Kind) { 2350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 2360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 2370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 2380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 2392b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_CurrentParameter: { 2402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor const char *Text = C->Text; 2412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned StrLen = strlen(Text); 2422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, StrLen); 2432b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor OS.write(Text, StrLen); 2440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2452b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 2462b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2472b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Optional: 2482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor C->Optional->Serialize(OS); 2490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 2520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 2530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 2540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 2550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 2560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 2570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 2580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 2590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 2600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 2620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 2630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 2640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2652b4074f1d3919e77cb33ca49c960521dea27afabDouglas GregorCodeCompletionString *CodeCompletionString::Deserialize(const char *&Str, 2662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor const char *StrEnd) { 2672b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Str == StrEnd || *Str == 0) 2682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return 0; 2690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 2712b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned NumBlocks; 2722b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, NumBlocks)) 2732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 2742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2752b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor for (unsigned I = 0; I != NumBlocks; ++I) { 2762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Str + 1 >= StrEnd) 2770c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2792b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor // Parse the next kind. 2802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned KindValue; 2812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, KindValue)) 2822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 2832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor switch (ChunkKind Kind = (ChunkKind)KindValue) { 2852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_TypedText: 2862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Text: 2872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Placeholder: 2882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Informative: 2892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_CurrentParameter: { 2902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned StrLen; 2912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd)) 2922b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 2932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddChunk(Chunk(Kind, StringRef(Str, StrLen))); 2952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Str += StrLen; 2960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 2982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Optional: { 3002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor std::auto_ptr<CodeCompletionString> Optional(Deserialize(Str, StrEnd)); 3010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddOptionalChunk(Optional); 3022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 3030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 3042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftParen: 3062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightParen: 3072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftBracket: 3082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightBracket: 3092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftBrace: 3102b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightBrace: 3112b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftAngle: 3122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightAngle: 3132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Comma: 3142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddChunk(Chunk(Kind)); 3152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 3160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 3172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor }; 3180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 3200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 3210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 32254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorvoid CodeCompleteConsumer::Result::Destroy() { 32354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (Kind == RK_Pattern) { 32454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor delete Pattern; 32554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Pattern = 0; 32654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 32754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 32854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 329e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 3300594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation 3310594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 3320594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl * 3330594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const { 3340594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor if (getKind() == CK_Function) 3350594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function; 3360594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else if (getKind() == CK_FunctionTemplate) 3370594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl(); 3380594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else 3390594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 3400594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 3410594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3420594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType * 3430594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 3440594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor switch (Kind) { 3450594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_Function: 3460594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function->getType()->getAs<FunctionType>(); 3470594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3480594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionTemplate: 3490594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl()->getType() 3500594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor ->getAs<FunctionType>(); 3510594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3520594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionType: 3530594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Type; 3540594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 3550594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3560594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 3570594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 3580594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3590594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 360e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation 361e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 362e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 36386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { } 364e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 36581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid 3663a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 3673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar Result *Results, 36881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor unsigned NumResults) { 36981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Print the results. 37081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 371f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "COMPLETION: "; 37281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor switch (Results[I].Kind) { 37381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor case Result::RK_Declaration: 37481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << Results[I].Declaration->getNameAsString() << " : " 37581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor << Results[I].Rank; 37681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (Results[I].Hidden) 37781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << " (Hidden)"; 37886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompletionString *CCS 37986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = Results[I].CreateCodeCompletionString(SemaRef)) { 380e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor OS << " : " << CCS->getAsString(); 381e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor delete CCS; 382e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 383e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 38481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << '\n'; 38581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 38681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 38781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor case Result::RK_Keyword: 38881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << Results[I].Keyword << " : " << Results[I].Rank << '\n'; 38981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 3903f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 3913f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor case Result::RK_Macro: { 3923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << Results[I].Macro->getName() << " : " << Results[I].Rank; 3933f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (CodeCompletionString *CCS 3943f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor = Results[I].CreateCodeCompletionString(SemaRef)) { 3953f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << " : " << CCS->getAsString(); 3963f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor delete CCS; 3973f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 3983f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << '\n'; 3993f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor break; 4003f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 40154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 40254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case Result::RK_Pattern: { 40354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor OS << "Pattern : " << Results[I].Rank << " : " 40454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor << Results[I].Pattern->getAsString() << '\n'; 40554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 40654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 40781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 40881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 40981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 41081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Once we've printed the code-completion results, suppress remaining 41181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // diagnostics. 41281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // FIXME: Move this somewhere else! 41386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics(); 41481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid 4173a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 4183a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor OverloadCandidate *Candidates, 4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor unsigned NumCandidates) { 4210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 42286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CodeCompletionString *CCS 42386d802e03a267af79663990c39865c67e0645238Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) { 424f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 42586d802e03a267af79663990c39865c67e0645238Douglas Gregor delete CCS; 4260594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4270594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4280594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4290594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor // Once we've printed the code-completion results, suppress remaining 4300594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor // diagnostics. 4310594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor // FIXME: Move this somewhere else! 4320594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics(); 4330594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 4350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid 4363a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarCIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 4373a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar Result *Results, 4380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor unsigned NumResults) { 4390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // Print the results. 4400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 4412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CXCursorKind Kind = CXCursor_NotImplemented; 4422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (Results[I].Kind) { 4442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Result::RK_Declaration: 4452b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor switch (Results[I].Declaration->getKind()) { 4462b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Record: 4472b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::CXXRecord: 4482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ClassTemplateSpecialization: { 4492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor RecordDecl *Record = cast<RecordDecl>(Results[I].Declaration); 4502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Record->isStruct()) 4512b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_StructDecl; 4522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor else if (Record->isUnion()) 4532b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_UnionDecl; 4542b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor else 4552b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ClassDecl; 4562b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4572b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 4582b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4592b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCMethod: { 4602b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(Results[I].Declaration); 4612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Method->isInstanceMethod()) 4622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCInstanceMethodDecl; 4632b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor else 4642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCClassMethodDecl; 4652b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 4670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 4682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Typedef: 4692b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_TypedefDecl; 4700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 4710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 4722b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Enum: 4732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_EnumDecl; 4740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 4750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 4762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Field: 4772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_FieldDecl; 4782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4792b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::EnumConstant: 4812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_EnumConstantDecl; 4822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Function: 4852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::CXXMethod: 4862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::CXXConstructor: 4872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::CXXDestructor: 4882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::CXXConversion: 4892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_FunctionDecl; 4902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4922b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::Var: 4932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_VarDecl; 4942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 4962b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ParmVar: 4972b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ParmDecl; 4982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCInterface: 5012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCInterfaceDecl; 5022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5032b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCCategory: 5052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCCategoryDecl; 5062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCProtocol: 5092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCProtocolDecl; 5100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 51154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 5122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCProperty: 5132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCPropertyDecl; 5142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5162b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCIvar: 5172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCIvarDecl; 5182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCImplementation: 5212b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCClassDefn; 5222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Decl::ObjCCategoryImpl: 5252b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_ObjCCategoryDefn; 5262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5272b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5282b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor default: 52954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 53054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 5312b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Result::RK_Keyword: 5342b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Result::RK_Macro: 5352b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case Result::RK_Pattern: 5362b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Kind = CXCursor_NotImplemented; 5372b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 5380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 5392b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, Kind); 5412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef); 5422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(CCS && "No code-completion string?"); 5432b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CCS->Serialize(OS); 5442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor delete CCS; 5450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 5460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // Once we've printed the code-completion results, suppress remaining 5480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // diagnostics. 5490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // FIXME: Move this somewhere else! 5500c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics(); 5510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 5520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid 5543a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarCIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 5553a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 5560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor OverloadCandidate *Candidates, 5570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor unsigned NumCandidates) { 5580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 5592b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, CXCursor_NotImplemented); 5602b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *CCS 5612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef); 5622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(CCS && "No code-completion string?"); 5632b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CCS->Serialize(OS); 5642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor delete CCS; 5650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 5660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // Once we've printed the code-completion results, suppress remaining 5680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // diagnostics. 5690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor // FIXME: Move this somewhere else! 5700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics(); 5710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 572