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" 1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang-c/Index.h" 1575b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h" 167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 172a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "clang/AST/DeclTemplate.h" 1881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h" 2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.h" 23577cdfdb20840350e841a483df630237326126d5Douglas Gregor#include "llvm/ADT/Twine.h" 2481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h" 2581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm> 26e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring> 27e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional> 2892eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor 2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 3081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 31e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor// Code completion context implementation 336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorbool CodeCompletionContext::wantConstructorResults() const { 366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Kind) { 3752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CCC_Recovery: 386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Statement: 396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Expression: 406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCMessageReceiver: 416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ParenthesizedExpression: 426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return true; 436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TopLevel: 456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCInterface: 466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCImplementation: 476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCIvarList: 486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassStructUnion: 493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_DotMemberAccess: 503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ArrowMemberAccess: 513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCPropertyAccess: 526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_EnumTag: 536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_UnionTag: 546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassOrStructTag: 556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCProtocolName: 566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Namespace: 576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Type: 586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Name: 596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PotentiallyQualifiedName: 606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroName: 616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroNameUse: 626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorExpression: 636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorDirective: 646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_NaturalLanguage: 656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_SelectorName: 666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TypeQualifiers: 6752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CCC_Other: 685c722c7020b33da57090422b854072258a50b3f0Douglas Gregor case CCC_OtherWithMacros: 693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCInstanceMessage: 703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCClassMessage: 710f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CCC_ObjCInterfaceName: 723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCCategoryName: 736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 757530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 767530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CodeCompletionContext::Kind!"); 776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 796f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 80e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation 81e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 82218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text) 83ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar : Kind(Kind), Text("") 840563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{ 850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (Kind) { 860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 890c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 90ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 91218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor case CK_CurrentParameter: 92218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor this->Text = Text; 930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Optional: 969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Optional strings cannot be created from text"); 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, 1936164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CXAvailabilityKind Availability, 1946164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen const char **Annotations, 195ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor unsigned NumAnnotations, 196d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko StringRef ParentName, 197d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const char *BriefComment) 198ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor : NumChunks(NumChunks), NumAnnotations(NumAnnotations), 199526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis Priority(Priority), Availability(Availability), 200d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko ParentName(ParentName), BriefComment(BriefComment) 201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{ 2026164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen assert(NumChunks <= 0xffff); 2036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen assert(NumAnnotations <= 0xffff); 2046164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1); 206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned I = 0; I != NumChunks; ++I) 207218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor StoredChunks[I] = Chunks[I]; 2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks); 2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (unsigned I = 0; I != NumAnnotations; ++I) 2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen StoredAnnotations[I] = Annotations[I]; 2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned CodeCompletionString::getAnnotationCount() const { 2156164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return NumAnnotations; 216e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 217e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 2186164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenconst char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const { 2196164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotationNr < NumAnnotations) 2206164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return reinterpret_cast<const char * const*>(end())[AnnotationNr]; 2216164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen else 2226164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return 0; 2236164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2246164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2256164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 226e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const { 227e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::string Result; 228e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor llvm::raw_string_ostream OS(Result); 229e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 230e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 231e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (C->Kind) { 232e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 2330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 234ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 235ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_Informative: 236ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 237ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor OS << "[#" << C->Text << "#]"; 238ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor break; 239ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 2410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor default: OS << C->Text; break; 242e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 243e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 2446bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman return OS.str(); 245e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 246e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 24754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const { 24854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 24954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (C->Kind == CK_TypedText) 25054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return C->Text; 25154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 25254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return 0; 25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 25454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(StringRef String) { 256dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor char *Mem = (char *)Allocate(String.size() + 1, 1); 257dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor std::copy(String.begin(), String.end(), Mem); 258dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Mem[String.size()] = 0; 259dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor return Mem; 260dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor} 261dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor 2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(Twine String) { 263577cdfdb20840350e841a483df630237326126d5Douglas Gregor // FIXME: It would be more efficient to teach Twine to tell us its size and 264577cdfdb20840350e841a483df630237326126d5Douglas Gregor // then add a routine there to fill in an allocated char* with the contents 265577cdfdb20840350e841a483df630237326126d5Douglas Gregor // of the string. 266f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Data; 267577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopyString(String.toStringRef(Data)); 268577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 269577cdfdb20840350e841a483df630237326126d5Douglas Gregor 27089cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri GribenkoStringRef CodeCompletionTUInfo::getParentName(const DeclContext *DC) { 27189cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const NamedDecl *ND = dyn_cast<NamedDecl>(DC); 27228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!ND) 27328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 27428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 27528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Check whether we've already cached the parent name. 27628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis StringRef &CachedParentName = ParentNames[DC]; 27728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!CachedParentName.empty()) 27828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return CachedParentName; 27928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 28028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // If we already processed this DeclContext and assigned empty to it, the 28128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // data pointer will be non-null. 28228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (CachedParentName.data() != 0) 28328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 28428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 28528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Find the interesting names. 28689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko SmallVector<const DeclContext *, 2> Contexts; 28728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis while (DC && !DC->isFunctionOrMethod()) { 28889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) { 28928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (ND->getIdentifier()) 29028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Contexts.push_back(DC); 29128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 29228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 29328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis DC = DC->getParent(); 29428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 29528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 29628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis { 297cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallString<128> S; 29828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis llvm::raw_svector_ostream OS(S); 29928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis bool First = true; 30028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis for (unsigned I = Contexts.size(); I != 0; --I) { 30128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (First) 30228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis First = false; 30328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis else { 30428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << "::"; 30528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 30628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 30789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const DeclContext *CurDC = Contexts[I-1]; 30889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(CurDC)) 30928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CurDC = CatImpl->getCategoryDecl(); 31028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 31189cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(CurDC)) { 31289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const ObjCInterfaceDecl *Interface = Cat->getClassInterface(); 31328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!Interface) { 31428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Assign an empty StringRef but with non-null data to distinguish 31528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // between empty because we didn't process the DeclContext yet. 31628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CachedParentName = StringRef((const char *)~0U, 0); 31728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 31828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 31928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 32028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << Interface->getName() << '(' << Cat->getName() << ')'; 32128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } else { 32228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << cast<NamedDecl>(CurDC)->getName(); 32328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 32628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CachedParentName = AllocatorRef->CopyString(OS.str()); 32728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 32928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return CachedParentName; 33028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis} 33128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() { 33328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis void *Mem = getAllocator().Allocate( 3346164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size() 3356164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen + sizeof(const char *) * Annotations.size(), 336218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor llvm::alignOf<CodeCompletionString>()); 337218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Result 338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(), 3396164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Priority, Availability, 340ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Annotations.data(), Annotations.size(), 341526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis ParentName, BriefComment); 342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunks.clear(); 34354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Result; 34454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 3450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3461eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTypedTextChunk(const char *Text) { 3471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk(CodeCompletionString::CK_TypedText, Text)); 3481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3491eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3501eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTextChunk(const char *Text) { 3511eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateText(Text)); 3521eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3531eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3541eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddOptionalChunk(CodeCompletionString *Optional) { 3551eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateOptional(Optional)); 3561eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3571eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3581eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddPlaceholderChunk(const char *Placeholder) { 3591eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreatePlaceholder(Placeholder)); 3601eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3611eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3621eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddInformativeChunk(const char *Text) { 3631eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateInformative(Text)); 3641eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3651eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3661eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddResultTypeChunk(const char *ResultType) { 3671eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateResultType(ResultType)); 3681eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3691eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid 3711eb18afd931f626713c066ede0707ceb522fa061Benjamin KramerCodeCompletionBuilder::AddCurrentParameterChunk(const char *CurrentParameter) { 3721eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter)); 3731eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3751eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddChunk(CodeCompletionString::ChunkKind CK, 3761eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer const char *Text) { 3771eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk(CK, Text)); 3781eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3791eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 38089cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkovoid CodeCompletionBuilder::addParentContext(const DeclContext *DC) { 381ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (DC->isTranslationUnit()) { 382ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 383ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 384ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 385ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (DC->isFunctionOrMethod()) 386ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 387ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 38889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const NamedDecl *ND = dyn_cast<NamedDecl>(DC); 389ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (!ND) 390ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 391ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 39228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ParentName = getCodeCompletionTUInfo().getParentName(DC); 393ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor} 394ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 395d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenkovoid CodeCompletionBuilder::addBriefComment(StringRef Comment) { 396d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko BriefComment = Allocator.CopyString(Comment); 397d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko} 398d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 399e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 4000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation 4010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 4020594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl * 4030594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const { 4040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor if (getKind() == CK_Function) 4050594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function; 4060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else if (getKind() == CK_FunctionTemplate) 4070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl(); 4080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else 4090594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 4100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType * 4130594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 4140594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor switch (Kind) { 4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_Function: 4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function->getType()->getAs<FunctionType>(); 4170594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4180594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionTemplate: 4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl()->getType() 4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor ->getAs<FunctionType>(); 4210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4220594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionType: 4230594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Type; 4240594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4257530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 4267530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CandidateKind!"); 4270594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4280594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4290594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 430e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation 431e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 432e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 43386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { } 434e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 43581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid 4363a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 437e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 4380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 43981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor unsigned NumResults) { 4401e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults); 4411e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 44281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Print the results. 44381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 444f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "COMPLETION: "; 44581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor switch (Results[I].Kind) { 4460a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Declaration: 447b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *Results[I].Declaration; 44881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (Results[I].Hidden) 44981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << " (Hidden)"; 45086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompletionString *CCS 45128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 452d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CCTUInfo, 453d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko includeBriefComments())) { 454e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor OS << " : " << CCS->getAsString(); 455d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (const char *BriefComment = CCS->getBriefComment()) 456d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko OS << " : " << BriefComment; 457e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 458e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 45981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << '\n'; 46081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 46181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 4620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Keyword: 463ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Keyword << '\n'; 46481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 4653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 4660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Macro: { 467ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Macro->getName(); 4683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (CodeCompletionString *CCS 46928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 470d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CCTUInfo, 471d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko includeBriefComments())) { 4723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << " : " << CCS->getAsString(); 4733f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 4743f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << '\n'; 4753f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor break; 4763f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 47754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 4780a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Pattern: { 479ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << "Pattern : " 48054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor << Results[I].Pattern->getAsString() << '\n'; 48154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 48254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 48381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 48481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 48581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 4860594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4870594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid 4883a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 4893a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 4900594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor OverloadCandidate *Candidates, 4910594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor unsigned NumCandidates) { 4920594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 49386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CodeCompletionString *CCS 494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef, 49528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis getAllocator(), CCTUInfo)) { 496f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 4970594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4980594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4990594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 5000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5018e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor/// \brief Retrieve the effective availability of the given declaration. 50289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkostatic AvailabilityResult getDeclAvailability(const Decl *D) { 5038e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor AvailabilityResult AR = D->getAvailability(); 5048e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor if (isa<EnumConstantDecl>(D)) 5058e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor AR = std::max(AR, cast<Decl>(D->getDeclContext())->getAvailability()); 5068e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor return AR; 5078e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor} 5088e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor 509d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggenvoid CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { 51087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor switch (Kind) { 511ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor case RK_Pattern: 512ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (!Declaration) { 513ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor // Do nothing: Patterns can come with cursor kinds! 514ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor break; 515ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 516ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor // Fall through 517ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 5188e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor case RK_Declaration: { 51958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor // Set the availability based on attributes. 5208e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor switch (getDeclAvailability(Declaration)) { 5210a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Available: 5220a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_NotYetIntroduced: 5230a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_Available; 5240a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 5250a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 5260a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Deprecated: 52758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Deprecated; 5280a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 52958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 5300a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Unavailable: 5310a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_NotAvailable; 5320a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 5330a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor } 5340a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 53589cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 536e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (Function->isDeleted()) 53758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_NotAvailable; 538e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 539e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor CursorKind = getCursorKindForDecl(Declaration); 540375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (CursorKind == CXCursor_UnexposedDecl) { 541bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // FIXME: Forward declarations of Objective-C classes and protocols 542bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // are not directly exposed, but we want code completion to treat them 543bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // like a definition. 544375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (isa<ObjCInterfaceDecl>(Declaration)) 545375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor CursorKind = CXCursor_ObjCInterfaceDecl; 546bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor else if (isa<ObjCProtocolDecl>(Declaration)) 547bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor CursorKind = CXCursor_ObjCProtocolDecl; 548375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor else 549375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor CursorKind = CXCursor_NotImplemented; 550375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor } 55187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 5528e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor } 55387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 5540a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Macro: 5550a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Keyword: 556e5f8372b5dccf5894f0263d018599c14d8f31273Benjamin Kramer llvm_unreachable("Macro and keyword kinds are handled by the constructors"); 5571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 558d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen 559d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen if (!Accessible) 560d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Availability = CXAvailability_NotAccessible; 5611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 5622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 563721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result. 564721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// 565721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be 566721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it. 5675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R, 568721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string &Saved) { 569721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor switch (R.Kind) { 570721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Keyword: 571721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Keyword; 572721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 573721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Pattern: 574721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Pattern->getTypedText(); 575721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 576721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Macro: 577721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Macro->getName(); 578721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 579721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Declaration: 580721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // Handle declarations below. 581721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor break; 582721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor } 583721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 584721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 585721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 586721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // If the name is a simple identifier (by far the common case), or a 587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // zero-argument selector, just return a reference to that identifier. 588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 589721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 590721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (Name.isObjCZeroArgSelector()) 591721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id 592721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 593721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 594721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 595721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor Saved = Name.getAsString(); 596721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Saved; 597721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 598721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 599721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X, 600721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor const CodeCompletionResult &Y) { 601721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string XSaved, YSaved; 6025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XStr = getOrderedName(X, XSaved); 6035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YStr = getOrderedName(Y, YSaved); 604721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor int cmp = XStr.compare_lower(YStr); 605721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (cmp) 606721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return cmp < 0; 607721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 6081e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor // If case-insensitive comparison fails, try case-sensitive comparison. 6091e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor cmp = XStr.compare(YStr); 6101e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (cmp) 6111e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return cmp < 0; 612721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 613721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return false; 614721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 615