CodeCompleteConsumer.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
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" 1419510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Scope.h" 15e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h" 1675b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h" 177cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 182a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "clang/AST/DeclTemplate.h" 1981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h" 202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor#include "clang-c/Index.h" 2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h" 22577cdfdb20840350e841a483df630237326126d5Douglas Gregor#include "llvm/ADT/Twine.h" 2381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h" 2481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm> 25e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring> 26e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional> 2792eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor 2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 30e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor// Code completion context implementation 326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorbool CodeCompletionContext::wantConstructorResults() const { 356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Kind) { 3652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CCC_Recovery: 376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Statement: 386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Expression: 396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCMessageReceiver: 406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ParenthesizedExpression: 416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return true; 426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TopLevel: 446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCInterface: 456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCImplementation: 466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCIvarList: 476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassStructUnion: 483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_DotMemberAccess: 493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ArrowMemberAccess: 503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCPropertyAccess: 516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_EnumTag: 526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_UnionTag: 536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassOrStructTag: 546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCProtocolName: 556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Namespace: 566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Type: 576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Name: 586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PotentiallyQualifiedName: 596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroName: 606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroNameUse: 616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorExpression: 626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorDirective: 636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_NaturalLanguage: 646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_SelectorName: 656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TypeQualifiers: 6652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CCC_Other: 675c722c7020b33da57090422b854072258a50b3f0Douglas Gregor case CCC_OtherWithMacros: 683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCInstanceMessage: 693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCClassMessage: 703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCSuperclass: 713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCCategoryName: 726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 756f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 79e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation 80e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 81218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text) 82ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar : Kind(Kind), Text("") 830563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{ 840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (Kind) { 850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 89ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 90218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor case CK_CurrentParameter: 91218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor this->Text = Text; 920c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Optional: 959f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Optional strings cannot be created from text"); 960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "("; 1000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 1030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ")"; 1040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 1070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "["; 1080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 1110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "]"; 1120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "{"; 1160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "}"; 1200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 1230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "<"; 1240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 1270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ">"; 1280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 1310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ", "; 1320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 135e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor this->Text = ":"; 13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 13701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 13901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = ";"; 14001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 14301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " = "; 14401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " "; 14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 15101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = "\n"; 15201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 1530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1550563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1560563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 157218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateText(const char *Text) { 1580563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Text, Text); 159e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 160e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 161e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) { 163e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Chunk Result; 164e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Kind = CK_Optional; 165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.Optional = Optional; 166e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor return Result; 167e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 168e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 169e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 170218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) { 1710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Placeholder, Placeholder); 1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1730563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1740563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 175218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateInformative(const char *Informative) { 1760563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Informative, Informative); 177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 178e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 1790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk 180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateResultType(const char *ResultType) { 181ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return Chunk(CK_ResultType, ResultType); 182ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 183ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 184ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk 1850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter( 186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor const char *CurrentParameter) { 1870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Chunk(CK_CurrentParameter, CurrentParameter); 1880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 1890c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::CodeCompletionString(const Chunk *Chunks, 191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned NumChunks, 192218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Priority, 193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CXAvailabilityKind Availability) 194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : NumChunks(NumChunks), Priority(Priority), Availability(Availability) 195218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{ 196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1); 197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned I = 0; I != NumChunks; ++I) 198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor StoredChunks[I] = Chunks[I]; 199e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 200e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 201e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const { 202e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::string Result; 203e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor llvm::raw_string_ostream OS(Result); 204e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 205e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 206e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (C->Kind) { 207e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 2080563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 209ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 210ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_Informative: 211ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 212ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor OS << "[#" << C->Text << "#]"; 213ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor break; 214ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 2160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor default: OS << C->Text; break; 217e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 218e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 2196bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman return OS.str(); 220e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 221e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 22254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const { 22354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 22454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (C->Kind == CK_TypedText) 22554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return C->Text; 22654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 22754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return 0; 22854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 22954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(StringRef String) { 231dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor char *Mem = (char *)Allocate(String.size() + 1, 1); 232dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor std::copy(String.begin(), String.end(), Mem); 233dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Mem[String.size()] = 0; 234dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor return Mem; 235dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor} 236dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor 2375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(Twine String) { 238577cdfdb20840350e841a483df630237326126d5Douglas Gregor // FIXME: It would be more efficient to teach Twine to tell us its size and 239577cdfdb20840350e841a483df630237326126d5Douglas Gregor // then add a routine there to fill in an allocated char* with the contents 240577cdfdb20840350e841a483df630237326126d5Douglas Gregor // of the string. 241577cdfdb20840350e841a483df630237326126d5Douglas Gregor llvm::SmallString<128> Data; 242577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopyString(String.toStringRef(Data)); 243577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 244577cdfdb20840350e841a483df630237326126d5Douglas Gregor 245218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() { 246218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor void *Mem = Allocator.Allocate( 247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size(), 248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor llvm::alignOf<CodeCompletionString>()); 249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Result 250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(), 251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Priority, Availability); 252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunks.clear(); 25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Result; 25454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 2550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallunsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) { 25712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (!ND) 25812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Unlikely; 25912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 26012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Context-based decisions. 2617a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *DC = ND->getDeclContext()->getRedeclContext(); 26297fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) { 26397fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor // _cmd is relatively rare 26497fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND)) 26597fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (ImplicitParam->getIdentifier() && 26697fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor ImplicitParam->getIdentifier()->isStr("_cmd")) 26797fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor return CCP_ObjC_cmd; 26897fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor 26912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_LocalDeclaration; 27097fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor } 27112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 27212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_MemberDeclaration; 27312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 27412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Content-based decisions. 27512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (isa<EnumConstantDecl>(ND)) 27612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Constant; 27712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 27812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Type; 27997fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor 28012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Declaration; 28112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 28212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 283e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 2840594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation 2850594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 2860594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl * 2870594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const { 2880594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor if (getKind() == CK_Function) 2890594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function; 2900594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else if (getKind() == CK_FunctionTemplate) 2910594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl(); 2920594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else 2930594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 2940594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 2950594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 2960594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType * 2970594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 2980594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor switch (Kind) { 2990594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_Function: 3000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function->getType()->getAs<FunctionType>(); 3010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3020594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionTemplate: 3030594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl()->getType() 3040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor ->getAs<FunctionType>(); 3050594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionType: 3070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Type; 3080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 3090594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 3110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 3120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 314e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation 315e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 316e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 31786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { } 318e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 31981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid 3203a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 321e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 3220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 32381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor unsigned NumResults) { 3241e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults); 3251e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 32681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Print the results. 32781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 328f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "COMPLETION: "; 32981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor switch (Results[I].Kind) { 3300a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Declaration: 331900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Results[I].Declaration; 33281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (Results[I].Hidden) 33381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << " (Hidden)"; 33486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompletionString *CCS 335218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) { 336e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor OS << " : " << CCS->getAsString(); 337e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 338e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 33981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << '\n'; 34081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 34181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Keyword: 343ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Keyword << '\n'; 34481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 3453f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 3460a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Macro: { 347ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Macro->getName(); 3483f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (CodeCompletionString *CCS 349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) { 3503f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << " : " << CCS->getAsString(); 3513f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 3523f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << '\n'; 3533f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor break; 3543f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 35554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 3560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Pattern: { 357ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << "Pattern : " 35854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor << Results[I].Pattern->getAsString() << '\n'; 35954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 36054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 36181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 36281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 36381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 3640594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 3650594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid 3663a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 3673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 3680594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor OverloadCandidate *Candidates, 3690594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor unsigned NumCandidates) { 3700594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 37186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CodeCompletionString *CCS 372218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef, 373218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Allocator)) { 374f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 3750594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 3760594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 3770594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 3780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3790a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallvoid CodeCompletionResult::computeCursorKindAndAvailability() { 38087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor switch (Kind) { 38187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor case RK_Declaration: 38258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor // Set the availability based on attributes. 3830a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor switch (Declaration->getAvailability()) { 3840a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Available: 3850a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_NotYetIntroduced: 3860a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_Available; 3870a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 3880a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 3890a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Deprecated: 39058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Deprecated; 3910a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 39258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 3930a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Unavailable: 3940a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_NotAvailable; 3950a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 3960a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor } 3970a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 398e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 399e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (Function->isDeleted()) 40058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_NotAvailable; 401e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 402e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor CursorKind = getCursorKindForDecl(Declaration); 403e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (CursorKind == CXCursor_UnexposedDecl) 40487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_NotImplemented; 40587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 40687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 4070a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Macro: 40858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Available; 40987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_MacroDefinition; 41087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 41187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 4120a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Keyword: 41358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Available; 41487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_NotImplemented; 41587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 41687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 4170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Pattern: 41887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Do nothing: Patterns can come with cursor kinds! 41987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 4201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 4211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 4222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 423721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result. 424721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// 425721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be 426721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it. 4275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R, 428721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string &Saved) { 429721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor switch (R.Kind) { 430721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Keyword: 431721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Keyword; 432721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 433721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Pattern: 434721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Pattern->getTypedText(); 435721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 436721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Macro: 437721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Macro->getName(); 438721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 439721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Declaration: 440721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // Handle declarations below. 441721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor break; 442721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor } 443721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 444721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 445721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 446721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // If the name is a simple identifier (by far the common case), or a 447721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // zero-argument selector, just return a reference to that identifier. 448721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 449721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 450721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (Name.isObjCZeroArgSelector()) 451721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id 452721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 453721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 454721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 455721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor Saved = Name.getAsString(); 456721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Saved; 457721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 458721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 459721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X, 460721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor const CodeCompletionResult &Y) { 461721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string XSaved, YSaved; 4625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XStr = getOrderedName(X, XSaved); 4635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YStr = getOrderedName(Y, YSaved); 464721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor int cmp = XStr.compare_lower(YStr); 465721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (cmp) 466721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return cmp < 0; 467721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 4681e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor // If case-insensitive comparison fails, try case-sensitive comparison. 4691e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor cmp = XStr.compare(YStr); 4701e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (cmp) 4711e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return cmp < 0; 472721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 473721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return false; 474721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 475