CodeCompleteConsumer.cpp revision e8d7bebc0dd037516dd695ee1ac2eb0923753b46
1afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===// 27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file is distributed under the University of Illinois Open Source 67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// License. See LICENSE.TXT for details. 77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 9afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 10afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// This file implements the CodeCompleteConsumer class. 11afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 12afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===----------------------------------------------------------------------===// 13afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/CodeCompleteConsumer.h" 14afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/Scope.h" 15afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/Sema.h" 16e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "clang/AST/DeclCXX.h" 17afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/AST/DeclObjC.h" 18afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/AST/DeclTemplate.h" 19d1a85a744cc1001c2b7fc37cf37aca266964f519Brian Gaeke#include "clang/Lex/Preprocessor.h" 20e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "clang-c/Index.h" 21e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "llvm/ADT/STLExtras.h" 22afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "llvm/Support/raw_ostream.h" 236520785dcd22012535934098942d57c07c7631c2Chris Lattner#include <algorithm> 24afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include <cstring> 255da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner#include <functional> 266db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner 27be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerusing namespace clang; 281b747167daf07a98f0ec33144b257c987c60e11dChris Lattnerusing llvm::StringRef; 29c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner 30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke//===----------------------------------------------------------------------===// 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke// Code completion string implementation 32c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner//===----------------------------------------------------------------------===// 33d0fde30ce850b78371fd1386338350591f9ff494Brian GaekeCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text) 34d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke : Kind(Kind), Text("") 356db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner{ 366db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner switch (Kind) { 376db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner case CK_TypedText: 386db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner case CK_Text: 3947ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner case CK_Placeholder: 4047ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner case CK_Informative: 416db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner case CK_ResultType: 426db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner case CK_CurrentParameter: { 43afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner char *New = new char [Text.size() + 1]; 446520785dcd22012535934098942d57c07c7631c2Chris Lattner std::memcpy(New, Text.data(), Text.size()); 456520785dcd22012535934098942d57c07c7631c2Chris Lattner New[Text.size()] = '\0'; 466520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = New; 476520785dcd22012535934098942d57c07c7631c2Chris Lattner break; 486520785dcd22012535934098942d57c07c7631c2Chris Lattner } 490cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 506520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_Optional: 516520785dcd22012535934098942d57c07c7631c2Chris Lattner llvm_unreachable("Optional strings cannot be created from text"); 526520785dcd22012535934098942d57c07c7631c2Chris Lattner break; 530cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 540cc8807029f577996a442b96d24c3346ed6de091Chris Lattner case CK_LeftParen: 556520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = "("; 566520785dcd22012535934098942d57c07c7631c2Chris Lattner break; 570cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 580cc8807029f577996a442b96d24c3346ed6de091Chris Lattner case CK_RightParen: 596520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = ")"; 606520785dcd22012535934098942d57c07c7631c2Chris Lattner break; 610cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 626520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_LeftBracket: 636520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = "["; 640cc8807029f577996a442b96d24c3346ed6de091Chris Lattner break; 650cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 666520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_RightBracket: 676520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = "]"; 680cc8807029f577996a442b96d24c3346ed6de091Chris Lattner break; 690cc8807029f577996a442b96d24c3346ed6de091Chris Lattner 706520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_LeftBrace: 716520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = "{"; 720cc8807029f577996a442b96d24c3346ed6de091Chris Lattner break; 736520785dcd22012535934098942d57c07c7631c2Chris Lattner 7444be25716628941b4cccccf56a28ee0ba2606850Chris Lattner case CK_RightBrace: 756520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = "}"; 765da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner break; 775da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner 785da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner case CK_LeftAngle: 796db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner this->Text = "<"; 806520785dcd22012535934098942d57c07c7631c2Chris Lattner break; 8147ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner 826520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_RightAngle: 8310f22cb1a0f2755050218cd0e07221a0985c6b63Chris Lattner this->Text = ">"; 8410f22cb1a0f2755050218cd0e07221a0985c6b63Chris Lattner break; 856520785dcd22012535934098942d57c07c7631c2Chris Lattner 866520785dcd22012535934098942d57c07c7631c2Chris Lattner case CK_Comma: 876520785dcd22012535934098942d57c07c7631c2Chris Lattner this->Text = ", "; 88ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner break; 89fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 90fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner case CK_Colon: 91fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner this->Text = ":"; 92fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner break; 93fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 94fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner case CK_SemiColon: 95ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner this->Text = ";"; 96ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner break; 97ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner 98ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner case CK_Equal: 99fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner this->Text = " = "; 10028b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner break; 10128b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner 10228b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner case CK_HorizontalSpace: 103dbe48dcaec69ff78e39e2d5faf4323ade6fffb04Chris Lattner this->Text = " "; 104fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner break; 105fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 106fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner case CK_VerticalSpace: 107fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner this->Text = "\n"; 108fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner break; 109c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner } 110c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner} 111c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner 112c6b519d64ef55d39e66a49510d4703a49bf228ccChris LattnerCodeCompletionString::Chunk 113c6b519d64ef55d39e66a49510d4703a49bf228ccChris LattnerCodeCompletionString::Chunk::CreateText(StringRef Text) { 114fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner return Chunk(CK_Text, Text); 115fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner} 116fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 117fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk 118fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk::CreateOptional( 119fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner std::auto_ptr<CodeCompletionString> Optional) { 1207546c3884a400b72d10fc19f120c6798b294a39dChris Lattner Chunk Result; 121fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner Result.Kind = CK_Optional; 122fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner Result.Optional = Optional.release(); 123fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner return Result; 124fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner} 125fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 126fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk 127fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) { 128fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner return Chunk(CK_Placeholder, Placeholder); 1291b747167daf07a98f0ec33144b257c987c60e11dChris Lattner} 130fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner 131fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk 132ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris LattnerCodeCompletionString::Chunk::CreateInformative(StringRef Informative) { 133be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner return Chunk(CK_Informative, Informative); 134be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner} 1357546c3884a400b72d10fc19f120c6798b294a39dChris Lattner 1367546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk 1377546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk::CreateResultType(StringRef ResultType) { 1387546c3884a400b72d10fc19f120c6798b294a39dChris Lattner return Chunk(CK_ResultType, ResultType); 1397546c3884a400b72d10fc19f120c6798b294a39dChris Lattner} 1407546c3884a400b72d10fc19f120c6798b294a39dChris Lattner 1417546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk 1427546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk::CreateCurrentParameter( 1437546c3884a400b72d10fc19f120c6798b294a39dChris Lattner StringRef CurrentParameter) { 1447546c3884a400b72d10fc19f120c6798b294a39dChris Lattner return Chunk(CK_CurrentParameter, CurrentParameter); 1457546c3884a400b72d10fc19f120c6798b294a39dChris Lattner} 1467546c3884a400b72d10fc19f120c6798b294a39dChris Lattner 1477546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const { 1487546c3884a400b72d10fc19f120c6798b294a39dChris Lattner switch (Kind) { 1497546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_TypedText: 1507546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Text: 1517546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Placeholder: 1527546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Informative: 1537546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_ResultType: 1547546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_CurrentParameter: 1557546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_LeftParen: 1567546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_RightParen: 1577546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_LeftBracket: 1587546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_RightBracket: 1597546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_LeftBrace: 1607546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_RightBrace: 1617546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_LeftAngle: 1627546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_RightAngle: 1637546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Comma: 1647546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Colon: 1657546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_SemiColon: 1667546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_Equal: 1677546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_HorizontalSpace: 1687546c3884a400b72d10fc19f120c6798b294a39dChris Lattner case CK_VerticalSpace: 1697546c3884a400b72d10fc19f120c6798b294a39dChris Lattner return Chunk(Kind, Text); 1707546c3884a400b72d10fc19f120c6798b294a39dChris Lattner 171be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Optional: { 172be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::auto_ptr<CodeCompletionString> Opt(Optional->Clone()); 173be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner return CreateOptional(Opt); 174be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner } 175be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner } 176be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 177be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner // Silence GCC warning. 178be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner return Chunk(); 179be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner} 180be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 181be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnervoid 182be21ca54e08339ede5dd4bbb882182d22e274988Chris LattnerCodeCompletionString::Chunk::Destroy() { 1835eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner switch (Kind) { 1845eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner case CK_Optional: 1855eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner delete Optional; 1865eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner break; 1875eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner 188be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_TypedText: 189be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Text: 190be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Placeholder: 191be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Informative: 192be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_ResultType: 193be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_CurrentParameter: 194be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner delete [] Text; 195be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner break; 196be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 197be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_LeftParen: 198be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_RightParen: 199be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_LeftBracket: 200be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_RightBracket: 201be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_LeftBrace: 202be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_RightBrace: 203be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_LeftAngle: 204be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_RightAngle: 205be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Comma: 206be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Colon: 207be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_SemiColon: 208be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_Equal: 209be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_HorizontalSpace: 210be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner case CK_VerticalSpace: 211be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner break; 212be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner } 213be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner} 214be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 215be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnervoid CodeCompletionString::clear() { 216be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::for_each(Chunks.begin(), Chunks.end(), 217be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::mem_fun_ref(&Chunk::Destroy)); 218be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner Chunks.clear(); 219be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner} 220be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 221be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerstd::string CodeCompletionString::getAsString() const { 222be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::string Result; 223 llvm::raw_string_ostream OS(Result); 224 225 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 226 switch (C->Kind) { 227 case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 228 case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 229 230 case CK_Informative: 231 case CK_ResultType: 232 OS << "[#" << C->Text << "#]"; 233 break; 234 235 case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 236 default: OS << C->Text; break; 237 } 238 } 239 return OS.str(); 240} 241 242const char *CodeCompletionString::getTypedText() const { 243 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 244 if (C->Kind == CK_TypedText) 245 return C->Text; 246 247 return 0; 248} 249 250CodeCompletionString * 251CodeCompletionString::Clone(CodeCompletionString *Result) const { 252 if (!Result) 253 Result = new CodeCompletionString; 254 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 255 Result->AddChunk(C->Clone()); 256 return Result; 257} 258 259static void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) { 260 OS.write((const char *)&Value, sizeof(unsigned)); 261} 262 263static bool ReadUnsigned(const char *&Memory, const char *MemoryEnd, 264 unsigned &Value) { 265 if (Memory + sizeof(unsigned) > MemoryEnd) 266 return true; 267 268 memmove(&Value, Memory, sizeof(unsigned)); 269 Memory += sizeof(unsigned); 270 return false; 271} 272 273void CodeCompletionString::Serialize(llvm::raw_ostream &OS) const { 274 // Write the number of chunks. 275 WriteUnsigned(OS, size()); 276 277 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 278 WriteUnsigned(OS, C->Kind); 279 280 switch (C->Kind) { 281 case CK_TypedText: 282 case CK_Text: 283 case CK_Placeholder: 284 case CK_Informative: 285 case CK_ResultType: 286 case CK_CurrentParameter: { 287 const char *Text = C->Text; 288 unsigned StrLen = strlen(Text); 289 WriteUnsigned(OS, StrLen); 290 OS.write(Text, StrLen); 291 break; 292 } 293 294 case CK_Optional: 295 C->Optional->Serialize(OS); 296 break; 297 298 case CK_LeftParen: 299 case CK_RightParen: 300 case CK_LeftBracket: 301 case CK_RightBracket: 302 case CK_LeftBrace: 303 case CK_RightBrace: 304 case CK_LeftAngle: 305 case CK_RightAngle: 306 case CK_Comma: 307 case CK_Colon: 308 case CK_SemiColon: 309 case CK_Equal: 310 case CK_HorizontalSpace: 311 case CK_VerticalSpace: 312 break; 313 } 314 } 315} 316 317bool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) { 318 if (Str == StrEnd || *Str == 0) 319 return false; 320 321 unsigned NumBlocks; 322 if (ReadUnsigned(Str, StrEnd, NumBlocks)) 323 return false; 324 325 for (unsigned I = 0; I != NumBlocks; ++I) { 326 if (Str + 1 >= StrEnd) 327 break; 328 329 // Parse the next kind. 330 unsigned KindValue; 331 if (ReadUnsigned(Str, StrEnd, KindValue)) 332 return false; 333 334 switch (ChunkKind Kind = (ChunkKind)KindValue) { 335 case CK_TypedText: 336 case CK_Text: 337 case CK_Placeholder: 338 case CK_Informative: 339 case CK_ResultType: 340 case CK_CurrentParameter: { 341 unsigned StrLen; 342 if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd)) 343 return false; 344 345 AddChunk(Chunk(Kind, StringRef(Str, StrLen))); 346 Str += StrLen; 347 break; 348 } 349 350 case CK_Optional: { 351 std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString()); 352 if (Optional->Deserialize(Str, StrEnd)) 353 AddOptionalChunk(Optional); 354 break; 355 } 356 357 case CK_LeftParen: 358 case CK_RightParen: 359 case CK_LeftBracket: 360 case CK_RightBracket: 361 case CK_LeftBrace: 362 case CK_RightBrace: 363 case CK_LeftAngle: 364 case CK_RightAngle: 365 case CK_Comma: 366 case CK_Colon: 367 case CK_SemiColon: 368 case CK_Equal: 369 case CK_HorizontalSpace: 370 case CK_VerticalSpace: 371 AddChunk(Chunk(Kind)); 372 break; 373 } 374 }; 375 376 return true; 377} 378 379void CodeCompletionResult::Destroy() { 380 if (Kind == RK_Pattern) { 381 delete Pattern; 382 Pattern = 0; 383 } 384} 385 386unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) { 387 if (!ND) 388 return CCP_Unlikely; 389 390 // Context-based decisions. 391 DeclContext *DC = ND->getDeclContext()->getRedeclContext(); 392 if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) 393 return CCP_LocalDeclaration; 394 if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 395 return CCP_MemberDeclaration; 396 397 // Content-based decisions. 398 if (isa<EnumConstantDecl>(ND)) 399 return CCP_Constant; 400 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 401 return CCP_Type; 402 return CCP_Declaration; 403} 404 405//===----------------------------------------------------------------------===// 406// Code completion overload candidate implementation 407//===----------------------------------------------------------------------===// 408FunctionDecl * 409CodeCompleteConsumer::OverloadCandidate::getFunction() const { 410 if (getKind() == CK_Function) 411 return Function; 412 else if (getKind() == CK_FunctionTemplate) 413 return FunctionTemplate->getTemplatedDecl(); 414 else 415 return 0; 416} 417 418const FunctionType * 419CodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 420 switch (Kind) { 421 case CK_Function: 422 return Function->getType()->getAs<FunctionType>(); 423 424 case CK_FunctionTemplate: 425 return FunctionTemplate->getTemplatedDecl()->getType() 426 ->getAs<FunctionType>(); 427 428 case CK_FunctionType: 429 return Type; 430 } 431 432 return 0; 433} 434 435//===----------------------------------------------------------------------===// 436// Code completion consumer implementation 437//===----------------------------------------------------------------------===// 438 439CodeCompleteConsumer::~CodeCompleteConsumer() { } 440 441void 442PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 443 CodeCompletionContext Context, 444 CodeCompletionResult *Results, 445 unsigned NumResults) { 446 std::stable_sort(Results, Results + NumResults); 447 448 // Print the results. 449 for (unsigned I = 0; I != NumResults; ++I) { 450 OS << "COMPLETION: "; 451 switch (Results[I].Kind) { 452 case CodeCompletionResult::RK_Declaration: 453 OS << Results[I].Declaration; 454 if (Results[I].Hidden) 455 OS << " (Hidden)"; 456 if (CodeCompletionString *CCS 457 = Results[I].CreateCodeCompletionString(SemaRef)) { 458 OS << " : " << CCS->getAsString(); 459 delete CCS; 460 } 461 462 OS << '\n'; 463 break; 464 465 case CodeCompletionResult::RK_Keyword: 466 OS << Results[I].Keyword << '\n'; 467 break; 468 469 case CodeCompletionResult::RK_Macro: { 470 OS << Results[I].Macro->getName(); 471 if (CodeCompletionString *CCS 472 = Results[I].CreateCodeCompletionString(SemaRef)) { 473 OS << " : " << CCS->getAsString(); 474 delete CCS; 475 } 476 OS << '\n'; 477 break; 478 } 479 480 case CodeCompletionResult::RK_Pattern: { 481 OS << "Pattern : " 482 << Results[I].Pattern->getAsString() << '\n'; 483 break; 484 } 485 } 486 } 487} 488 489void 490PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 491 unsigned CurrentArg, 492 OverloadCandidate *Candidates, 493 unsigned NumCandidates) { 494 for (unsigned I = 0; I != NumCandidates; ++I) { 495 if (CodeCompletionString *CCS 496 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) { 497 OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 498 delete CCS; 499 } 500 } 501} 502 503void CodeCompletionResult::computeCursorKindAndAvailability() { 504 switch (Kind) { 505 case RK_Declaration: 506 // Set the availability based on attributes. 507 Availability = CXAvailability_Available; 508 if (Declaration->getAttr<UnavailableAttr>()) 509 Availability = CXAvailability_NotAvailable; 510 else if (Declaration->getAttr<DeprecatedAttr>()) 511 Availability = CXAvailability_Deprecated; 512 513 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 514 if (Function->isDeleted()) 515 Availability = CXAvailability_NotAvailable; 516 517 CursorKind = getCursorKindForDecl(Declaration); 518 if (CursorKind == CXCursor_UnexposedDecl) 519 CursorKind = CXCursor_NotImplemented; 520 break; 521 522 case RK_Macro: 523 Availability = CXAvailability_Available; 524 CursorKind = CXCursor_MacroDefinition; 525 break; 526 527 case RK_Keyword: 528 Availability = CXAvailability_Available; 529 CursorKind = CXCursor_NotImplemented; 530 break; 531 532 case RK_Pattern: 533 // Do nothing: Patterns can come with cursor kinds! 534 break; 535 } 536} 537 538/// \brief Retrieve the name that should be used to order a result. 539/// 540/// If the name needs to be constructed as a string, that string will be 541/// saved into Saved and the returned StringRef will refer to it. 542static llvm::StringRef getOrderedName(const CodeCompletionResult &R, 543 std::string &Saved) { 544 switch (R.Kind) { 545 case CodeCompletionResult::RK_Keyword: 546 return R.Keyword; 547 548 case CodeCompletionResult::RK_Pattern: 549 return R.Pattern->getTypedText(); 550 551 case CodeCompletionResult::RK_Macro: 552 return R.Macro->getName(); 553 554 case CodeCompletionResult::RK_Declaration: 555 // Handle declarations below. 556 break; 557 } 558 559 DeclarationName Name = R.Declaration->getDeclName(); 560 561 // If the name is a simple identifier (by far the common case), or a 562 // zero-argument selector, just return a reference to that identifier. 563 if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 564 return Id->getName(); 565 if (Name.isObjCZeroArgSelector()) 566 if (IdentifierInfo *Id 567 = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 568 return Id->getName(); 569 570 Saved = Name.getAsString(); 571 return Saved; 572} 573 574bool clang::operator<(const CodeCompletionResult &X, 575 const CodeCompletionResult &Y) { 576 std::string XSaved, YSaved; 577 llvm::StringRef XStr = getOrderedName(X, XSaved); 578 llvm::StringRef YStr = getOrderedName(Y, YSaved); 579 int cmp = XStr.compare_lower(YStr); 580 if (cmp) 581 return cmp < 0; 582 583 // If case-insensitive comparison fails, try case-sensitive comparison. 584 cmp = XStr.compare(YStr); 585 if (cmp) 586 return cmp < 0; 587 588 return false; 589} 590 591void 592CIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 593 CodeCompletionContext Context, 594 CodeCompletionResult *Results, 595 unsigned NumResults) { 596 // Print the results. 597 for (unsigned I = 0; I != NumResults; ++I) { 598 WriteUnsigned(OS, Results[I].CursorKind); 599 WriteUnsigned(OS, Results[I].Priority); 600 WriteUnsigned(OS, Results[I].Availability); 601 CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef); 602 assert(CCS && "No code-completion string?"); 603 CCS->Serialize(OS); 604 delete CCS; 605 } 606} 607 608void 609CIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 610 unsigned CurrentArg, 611 OverloadCandidate *Candidates, 612 unsigned NumCandidates) { 613 for (unsigned I = 0; I != NumCandidates; ++I) { 614 WriteUnsigned(OS, CXCursor_NotImplemented); 615 WriteUnsigned(OS, /*Priority=*/I); 616 WriteUnsigned(OS, /*Availability=*/CXAvailability_Available); 617 CodeCompletionString *CCS 618 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef); 619 assert(CCS && "No code-completion string?"); 620 CCS->Serialize(OS); 621 delete CCS; 622 } 623} 624