CodeCompleteConsumer.cpp revision 3ea9e33ea25e0c2b12db56418ba3f994eb662c04
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" 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h" 2081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.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: 700f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CCC_ObjCInterfaceName: 713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CCC_ObjCCategoryName: 726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 747530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 757530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CodeCompletionContext::Kind!"); 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 970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "("; 990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 1020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ")"; 1030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 1060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "["; 1070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 1100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "]"; 1110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "{"; 1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "}"; 1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 1220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "<"; 1230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 1260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ">"; 1270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 1300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ", "; 1310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 13201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 134e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor this->Text = ":"; 13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 13801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = ";"; 13901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 14201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " = "; 14301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " "; 14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 15001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = "\n"; 15101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 1520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 1530563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1550563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 156218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateText(const char *Text) { 1570563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Text, Text); 158e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 159e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 160e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 161218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) { 162e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Chunk Result; 163e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Kind = CK_Optional; 164218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.Optional = Optional; 165e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor return Result; 166e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 167e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 168e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 169218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) { 1700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Placeholder, Placeholder); 1710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1730563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 174218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateInformative(const char *Informative) { 1750563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Informative, Informative); 176e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 1780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk 179218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateResultType(const char *ResultType) { 180ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return Chunk(CK_ResultType, ResultType); 181ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 182ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 183ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk 1840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter( 185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor const char *CurrentParameter) { 1860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Chunk(CK_CurrentParameter, CurrentParameter); 1870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 1880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 189218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::CodeCompletionString(const Chunk *Chunks, 190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned NumChunks, 191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Priority, 1926164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CXAvailabilityKind Availability, 1936164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen const char **Annotations, 194ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor unsigned NumAnnotations, 195d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko StringRef ParentName, 196d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const char *BriefComment) 197ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor : NumChunks(NumChunks), NumAnnotations(NumAnnotations), 198526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis Priority(Priority), Availability(Availability), 199d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko ParentName(ParentName), BriefComment(BriefComment) 200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{ 2016164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen assert(NumChunks <= 0xffff); 2026164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen assert(NumAnnotations <= 0xffff); 2036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1); 205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned I = 0; I != NumChunks; ++I) 206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor StoredChunks[I] = Chunks[I]; 2076164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks); 2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (unsigned I = 0; I != NumAnnotations; ++I) 2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen StoredAnnotations[I] = Annotations[I]; 2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned CodeCompletionString::getAnnotationCount() const { 2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return NumAnnotations; 215e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 216e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 2176164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenconst char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const { 2186164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotationNr < NumAnnotations) 2196164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return reinterpret_cast<const char * const*>(end())[AnnotationNr]; 2206164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen else 2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2226164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2236164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2246164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 225e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const { 226e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::string Result; 227e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor llvm::raw_string_ostream OS(Result); 228e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 229e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 230e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (C->Kind) { 231e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 2320563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 233ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 234ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_Informative: 235ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 236ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor OS << "[#" << C->Text << "#]"; 237ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor break; 238ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 2400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor default: OS << C->Text; break; 241e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 242e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 2436bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman return OS.str(); 244e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 245e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 24654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const { 24754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 24854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (C->Kind == CK_TypedText) 24954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return C->Text; 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 25254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarconst char *CodeCompletionAllocator::CopyString(const Twine &String) { 2553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallString<128> Data; 2563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar StringRef Ref = String.toStringRef(Data); 257577cdfdb20840350e841a483df630237326126d5Douglas Gregor // FIXME: It would be more efficient to teach Twine to tell us its size and 258577cdfdb20840350e841a483df630237326126d5Douglas Gregor // then add a routine there to fill in an allocated char* with the contents 259577cdfdb20840350e841a483df630237326126d5Douglas Gregor // of the string. 2603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar char *Mem = (char *)Allocate(Ref.size() + 1, 1); 2613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar std::copy(Ref.begin(), Ref.end(), Mem); 2623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Mem[Ref.size()] = 0; 2633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return Mem; 264577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 265577cdfdb20840350e841a483df630237326126d5Douglas Gregor 26689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri GribenkoStringRef CodeCompletionTUInfo::getParentName(const DeclContext *DC) { 26789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const NamedDecl *ND = dyn_cast<NamedDecl>(DC); 26828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!ND) 26928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 27028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 27128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Check whether we've already cached the parent name. 27228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis StringRef &CachedParentName = ParentNames[DC]; 27328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!CachedParentName.empty()) 27428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return CachedParentName; 27528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 27628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // If we already processed this DeclContext and assigned empty to it, the 27728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // data pointer will be non-null. 2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CachedParentName.data() != nullptr) 27928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 28028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 28128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Find the interesting names. 28289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko SmallVector<const DeclContext *, 2> Contexts; 28328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis while (DC && !DC->isFunctionOrMethod()) { 28489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) { 28528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (ND->getIdentifier()) 28628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Contexts.push_back(DC); 28728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 28828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 28928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis DC = DC->getParent(); 29028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 29128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 29228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis { 293cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallString<128> S; 29428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis llvm::raw_svector_ostream OS(S); 29528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis bool First = true; 29628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis for (unsigned I = Contexts.size(); I != 0; --I) { 29728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (First) 29828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis First = false; 29928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis else { 30028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << "::"; 30128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 30228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 30389cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const DeclContext *CurDC = Contexts[I-1]; 30489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(CurDC)) 30528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CurDC = CatImpl->getCategoryDecl(); 30628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 30789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(CurDC)) { 30889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const ObjCInterfaceDecl *Interface = Cat->getClassInterface(); 30928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis if (!Interface) { 31028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // Assign an empty StringRef but with non-null data to distinguish 31128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis // between empty because we didn't process the DeclContext yet. 31228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CachedParentName = StringRef((const char *)~0U, 0); 31328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return StringRef(); 31428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 31528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 31628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << Interface->getName() << '(' << Cat->getName() << ')'; 31728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } else { 31828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis OS << cast<NamedDecl>(CurDC)->getName(); 31928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 32228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CachedParentName = AllocatorRef->CopyString(OS.str()); 32328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis } 32428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 32528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return CachedParentName; 32628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis} 32728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() { 32928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis void *Mem = getAllocator().Allocate( 3306164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size() 3316164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen + sizeof(const char *) * Annotations.size(), 332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor llvm::alignOf<CodeCompletionString>()); 333218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Result 334218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(), 3356164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Priority, Availability, 336ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Annotations.data(), Annotations.size(), 337526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis ParentName, BriefComment); 338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Chunks.clear(); 33954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Result; 34054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 3410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3421eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTypedTextChunk(const char *Text) { 3431eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk(CodeCompletionString::CK_TypedText, Text)); 3441eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3451eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3461eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTextChunk(const char *Text) { 3471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateText(Text)); 3481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3491eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3501eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddOptionalChunk(CodeCompletionString *Optional) { 3511eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateOptional(Optional)); 3521eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3531eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3541eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddPlaceholderChunk(const char *Placeholder) { 3551eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreatePlaceholder(Placeholder)); 3561eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3571eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3581eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddInformativeChunk(const char *Text) { 3591eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateInformative(Text)); 3601eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3611eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3621eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddResultTypeChunk(const char *ResultType) { 3631eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateResultType(ResultType)); 3641eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3651eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3661eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid 3671eb18afd931f626713c066ede0707ceb522fa061Benjamin KramerCodeCompletionBuilder::AddCurrentParameterChunk(const char *CurrentParameter) { 3681eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter)); 3691eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 3711eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddChunk(CodeCompletionString::ChunkKind CK, 3721eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer const char *Text) { 3731eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Chunks.push_back(Chunk(CK, Text)); 3741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer} 3751eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer 37689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkovoid CodeCompletionBuilder::addParentContext(const DeclContext *DC) { 377ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (DC->isTranslationUnit()) { 378ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 379ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 380ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 381ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (DC->isFunctionOrMethod()) 382ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 383ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 38489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko const NamedDecl *ND = dyn_cast<NamedDecl>(DC); 385ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (!ND) 386ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor return; 387ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 38828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ParentName = getCodeCompletionTUInfo().getParentName(DC); 389ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor} 390ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 391d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenkovoid CodeCompletionBuilder::addBriefComment(StringRef Comment) { 392d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko BriefComment = Allocator.CopyString(Comment); 393d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko} 394d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 395e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 3960594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation 3970594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 3980594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl * 3990594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const { 4000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor if (getKind() == CK_Function) 4010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function; 4020594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else if (getKind() == CK_FunctionTemplate) 4030594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl(); 4040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else 4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType * 4090594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 4100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor switch (Kind) { 4110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_Function: 4120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function->getType()->getAs<FunctionType>(); 4130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4140594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionTemplate: 4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl()->getType() 4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor ->getAs<FunctionType>(); 4170594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4180594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionType: 4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Type; 4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4217530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 4227530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CandidateKind!"); 4230594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4240594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4250594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 426e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation 427e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 428e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 42986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { } 430e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 43181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid 4323a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 433e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 4340a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 43581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor unsigned NumResults) { 4361e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults); 4371e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 43881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Print the results. 43981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 440f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "COMPLETION: "; 44181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor switch (Results[I].Kind) { 4420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Declaration: 443b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *Results[I].Declaration; 44481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (Results[I].Hidden) 44581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << " (Hidden)"; 44686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompletionString *CCS 44728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 448d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CCTUInfo, 449d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko includeBriefComments())) { 450e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor OS << " : " << CCS->getAsString(); 451d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (const char *BriefComment = CCS->getBriefComment()) 452d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko OS << " : " << BriefComment; 453e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 454e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 45581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << '\n'; 45681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 45781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 4580a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Keyword: 459ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Keyword << '\n'; 46081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 4613f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 4620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Macro: { 463ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Macro->getName(); 4643f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (CodeCompletionString *CCS 46528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 466d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CCTUInfo, 467d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko includeBriefComments())) { 4683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << " : " << CCS->getAsString(); 4693f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 4703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << '\n'; 4713f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor break; 4723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 47354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 4740a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Pattern: { 475ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << "Pattern : " 47654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor << Results[I].Pattern->getAsString() << '\n'; 47754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 47854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 47981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 48081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 48181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 4820594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// This function is used solely to preserve the former presentation of overloads 4840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// by "clang -cc1 -code-completion-at", since CodeCompletionString::getAsString 4850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// needs to be improved for printing the newer and more detailed overload 4860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// chunks. 4870e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic std::string getOverloadAsString(const CodeCompletionString &CCS) { 4880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::string Result; 4890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::raw_string_ostream OS(Result); 4900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 4910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto &C : CCS) { 4920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines switch (C.Kind) { 4930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case CodeCompletionString::CK_Informative: 4940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case CodeCompletionString::CK_ResultType: 4950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines OS << "[#" << C.Text << "#]"; 4960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 4970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 4980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case CodeCompletionString::CK_CurrentParameter: 4990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines OS << "<#" << C.Text << "#>"; 5000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 5010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 5020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines default: OS << C.Text; break; 5030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 5040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 5050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return OS.str(); 5060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 5070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 5080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid 5093a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 5103a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 5110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor OverloadCandidate *Candidates, 5120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor unsigned NumCandidates) { 5130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 51486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CodeCompletionString *CCS 515218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef, 5160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getAllocator(), CCTUInfo, 5170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines includeBriefComments())) { 5180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines OS << "OVERLOAD: " << getOverloadAsString(*CCS) << "\n"; 5190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 5200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 5210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 5220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5238e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor/// \brief Retrieve the effective availability of the given declaration. 52489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkostatic AvailabilityResult getDeclAvailability(const Decl *D) { 5258e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor AvailabilityResult AR = D->getAvailability(); 5268e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor if (isa<EnumConstantDecl>(D)) 5278e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor AR = std::max(AR, cast<Decl>(D->getDeclContext())->getAvailability()); 5288e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor return AR; 5298e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor} 5308e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor 531d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggenvoid CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { 53287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor switch (Kind) { 533ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor case RK_Pattern: 534ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (!Declaration) { 535ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor // Do nothing: Patterns can come with cursor kinds! 536ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor break; 537ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 538ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor // Fall through 539ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 5408e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor case RK_Declaration: { 54158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor // Set the availability based on attributes. 5428e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor switch (getDeclAvailability(Declaration)) { 5430a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Available: 5440a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_NotYetIntroduced: 5450a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_Available; 5460a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 5470a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 5480a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Deprecated: 54958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Deprecated; 5500a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 55158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 5520a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor case AR_Unavailable: 5530a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Availability = CXAvailability_NotAvailable; 5540a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor break; 5550a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor } 5560a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 55789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 558e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (Function->isDeleted()) 55958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_NotAvailable; 560e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 561e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor CursorKind = getCursorKindForDecl(Declaration); 562375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (CursorKind == CXCursor_UnexposedDecl) { 563bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // FIXME: Forward declarations of Objective-C classes and protocols 564bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // are not directly exposed, but we want code completion to treat them 565bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor // like a definition. 566375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor if (isa<ObjCInterfaceDecl>(Declaration)) 567375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor CursorKind = CXCursor_ObjCInterfaceDecl; 568bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor else if (isa<ObjCProtocolDecl>(Declaration)) 569bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor CursorKind = CXCursor_ObjCProtocolDecl; 570375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor else 571375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor CursorKind = CXCursor_NotImplemented; 572375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor } 57387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 5748e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor } 57587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 5760a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Macro: 5770a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Keyword: 578e5f8372b5dccf5894f0263d018599c14d8f31273Benjamin Kramer llvm_unreachable("Macro and keyword kinds are handled by the constructors"); 5791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 580d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen 581d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen if (!Accessible) 582d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Availability = CXAvailability_NotAccessible; 5831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 5842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 585721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result. 586721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// 587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be 588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it. 5895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R, 590721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string &Saved) { 591721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor switch (R.Kind) { 592721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Keyword: 593721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Keyword; 594721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 595721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Pattern: 596721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Pattern->getTypedText(); 597721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 598721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Macro: 599721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Macro->getName(); 600721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 601721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Declaration: 602721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // Handle declarations below. 603721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor break; 604721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor } 605721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 606721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 607721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 608721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // If the name is a simple identifier (by far the common case), or a 609721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // zero-argument selector, just return a reference to that identifier. 610721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 611721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 612721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (Name.isObjCZeroArgSelector()) 613721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id 614721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 615721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 616721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 617721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor Saved = Name.getAsString(); 618721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Saved; 619721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 620721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 621721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X, 622721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor const CodeCompletionResult &Y) { 623721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string XSaved, YSaved; 6245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XStr = getOrderedName(X, XSaved); 6255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YStr = getOrderedName(Y, YSaved); 626721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor int cmp = XStr.compare_lower(YStr); 627721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (cmp) 628721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return cmp < 0; 629721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 6301e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor // If case-insensitive comparison fails, try case-sensitive comparison. 6311e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor cmp = XStr.compare(YStr); 6321e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (cmp) 6331e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return cmp < 0; 634721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 635721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return false; 636721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 637