CIndexCodeCompletion.cpp revision 0f91c8ccb398be2bd40dc402309bd79737542396
1ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===- CIndexCodeCompletion.cpp - Code Completion API hooks ---------------===// 2ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 3ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// The LLVM Compiler Infrastructure 4ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 5ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file is distributed under the University of Illinois Open Source 6ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// License. See LICENSE.TXT for details. 7ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 8ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===// 9ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 10ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file implements the Clang-C Source Indexing library hooks for 11ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// code completion. 12ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 13ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===// 14ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 15ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "CIndexer.h" 160a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek#include "CXTranslationUnit.h" 17ed122735639d83c10f18c28c7fd117bfcd0f62cbTed Kremenek#include "CXString.h" 18e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "CXCursor.h" 19936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "CIndexDiagnostic.h" 20e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Type.h" 21e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Decl.h" 22e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/DeclObjC.h" 23b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/SourceManager.h" 24b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.h" 251abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#include "clang/Frontend/ASTUnit.h" 26b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Frontend/CompilerInstance.h" 27936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 28ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang/Sema/CodeCompleteConsumer.h" 29df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/ADT/SmallString.h" 30ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/ADT/StringExtras.h" 311fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor#include "llvm/Support/Atomic.h" 32b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar#include "llvm/Support/CrashRecoveryContext.h" 33ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 34df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 35df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 3603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 373d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdlib> 383d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 39ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 40df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 41da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 42da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 43da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 44da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 45da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 46da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 47da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 48da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 49ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 502ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenekusing namespace clang::cxstring; 51ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 52ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 53ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 54ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 55ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 56ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 57218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 58ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 59ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 61ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 62ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 68ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 69ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 90ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 91ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 92ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 93ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 9401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 9501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 9601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 9701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 9801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 9901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 10001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 10101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 10201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 10301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 104ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 105ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 106ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 107ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 108ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 109ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1102ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed KremenekCXString clang_getCompletionChunkText(CXCompletionString completion_string, 1112ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek unsigned chunk_number) { 112218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 113ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 114a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek return createCXString((const char*)0); 115ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 116ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 117ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 119ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 120ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 121ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 122ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 123ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 124ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 125ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 126ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 127ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 128ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 129ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 130ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 131ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 13201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 13621c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor case CodeCompletionString::CK_VerticalSpace: 1375a9c0bca4504eeda45a3fd0ae1c244b2994f38b2Douglas Gregor return createCXString((*CCStr)[chunk_number].Text, false); 13821c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor 139ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 140ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 1412ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(""); 142ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 143ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 144ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 145a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek return createCXString((const char*)0); 146ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 147ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1482ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek 149ab1889321f6f8f200f2b318ac26883ac18e49d03Ted KremenekCXCompletionString 150ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkCompletionString(CXCompletionString completion_string, 151ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 152218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 153ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 154ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 155ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 156ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 157ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 158ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 159ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 160ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 161ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 162ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 163ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 164ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 165ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 166ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 167ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 168ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 169ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 170ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 171ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 17201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 17301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 17401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 17501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 17601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 177ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 178ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 179ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 180ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 181ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return (*CCStr)[chunk_number].Optional; 182ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 183ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 184ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 185ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 186ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 187ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 188ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekunsigned clang_getNumCompletionChunks(CXCompletionString completion_string) { 189218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 190ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CCStr? CCStr->size() : 0; 191ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 192ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 19312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorunsigned clang_getCompletionPriority(CXCompletionString completion_string) { 194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 195a2ace58cf99f9279a7467d987c6094145dd19d8bBill Wendling return CCStr? CCStr->getPriority() : unsigned(CCP_Unlikely); 19612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 19712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 19858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorenum CXAvailabilityKind 19958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorclang_getCompletionAvailability(CXCompletionString completion_string) { 200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return CCStr? static_cast<CXAvailabilityKind>(CCStr->getAvailability()) 202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : CXAvailability_Available; 20358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor} 20458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 205ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 206ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 207ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2080d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults(const FileSystemOptions& FileSystemOpts); 2090a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2100a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 211a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 2125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StoredDiagnostic, 8> Diagnostics; 213a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 214f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 2151abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diag; 216f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 217a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 21835b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 219389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 220389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 221389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 22239b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner /// \brief File manager, used for diagnostics. 2234f32786ac45210143654390177105eb749b614e9Ted Kremenek llvm::IntrusiveRefCntPtr<FileManager> FileMgr; 22439b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 225389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 2264f32786ac45210143654390177105eb749b614e9Ted Kremenek llvm::IntrusiveRefCntPtr<SourceManager> SourceMgr; 227313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 228313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 229313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 230313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 231b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 2327ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// \brief Temporary buffers that will be deleted once we have finished with 2337ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// the code-completion results. 2345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 235218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 23648601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor /// \brief Allocator used to store globally cached code-completion results. 23748601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor llvm::IntrusiveRefCntPtr<clang::GlobalCodeCompletionAllocator> 23848601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor CachedCompletionAllocator; 23948601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 240218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Allocator used to store code completion results. 241110a68e38bb37526f9bd1d4e8f1b941fe5410b27Douglas Gregor clang::CodeCompletionAllocator CodeCompletionAllocator; 2423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief Context under which completion occurred. 2443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum clang::CodeCompletionContext::Kind ContextKind; 2453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief A bitfield representing the acceptable completions for the 2473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// current context. 2483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long Contexts; 249e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 2500a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The kind of the container for the current context for completions. 251e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CXCursorKind ContainerKind; 2520a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The USR of the container for the current context for completions. 253e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString ContainerUSR; 2540a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief a boolean value indicating whether there is complete information 2550a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// about the container 256e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned ContainerIsIncomplete; 2570a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 2580a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief A string containing the Objective-C selector entered thus far for a 2590a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// message send. 2600a47d69af8bda945352997af3da4687a3356096aDouglas Gregor std::string Selector; 261ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 262ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 263e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// \brief Tracks the number of code-completion result objects that are 264e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// currently active. 265e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// 266e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// Used for debugging purposes only. 2671fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregorstatic llvm::sys::cas_flag CodeCompletionResultObjects; 268e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 2690d8d7e6067f9093e7d5abc45c9639ab977aab692Anders CarlssonAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults( 2700d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson const FileSystemOptions& FileSystemOpts) 27133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : CXCodeCompleteResults(), 27233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(new Diagnostic( 27333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs))), 2740d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson FileSystemOpts(FileSystemOpts), 2754f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr(new FileManager(FileSystemOpts)), 2764f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr(new SourceManager(*Diag, *FileMgr)) { 277e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2781fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicIncrement(&CodeCompletionResultObjects); 279e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "+++ %d completion results\n", CodeCompletionResultObjects); 280e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 281e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor} 2820a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2830a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 2840a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 285313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 286e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor clang_disposeString(ContainerUSR); 287e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 288313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 289313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 290b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 291b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 292e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 293e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2941fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicDecrement(&CodeCompletionResultObjects); 295e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "--- %d completion results\n", CodeCompletionResultObjects); 296e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 2970a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 2980a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2991abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 3001abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorstatic unsigned long long getContextsForContextKind( 3023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind, 3033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor Sema &S) { 3043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long contexts = 0; 3053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor switch (kind) { 3063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_OtherWithMacros: { 3073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We can allow macros here, but we don't know what else is permissible 3083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //So we'll say the only thing permissible are macros 3093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 3103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TopLevel: 3133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCIvarList: 3143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassStructUnion: 3153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Type: { 3163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Statement: { 3283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 3313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Expression: { 3413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyValue; 3423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_AnyType | 3443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: { 3543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCObjectValue | 3553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCSelectorValue | 3563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_CXXClassTypeValue | 3593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyType | 3603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_DotMemberAccess: { 3693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_DotMemberAccess; 3703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ArrowMemberAccess: { 3733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ArrowMemberAccess; 3743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCPropertyAccess: { 3773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCPropertyAccess; 3783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_EnumTag: { 3813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_EnumTag | 3823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_UnionTag: { 3863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_UnionTag | 3873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassOrStructTag: { 3913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_StructTag | 3923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCProtocolName: { 3973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCProtocol; 3983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Namespace: { 4013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Namespace; 4023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PotentiallyQualifiedName: { 4053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NestedNameSpecifier; 4063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroNameUse: { 4093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 4103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_NaturalLanguage: { 4133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NaturalLanguage; 4143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_SelectorName: { 4173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCSelectorName; 4183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: { 4213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 4223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 4233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 4243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 4253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 4263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInstanceMessage: { 4343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInstanceMessage; 4353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCClassMessage: { 4383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCClassMessage; 4393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4410f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CodeCompletionContext::CCC_ObjCInterfaceName: { 4423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInterface; 4433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCCategoryName: { 4463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCCategory; 4473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Other: 4503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInterface: 4513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCImplementation: 4523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Name: 4533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroName: 4543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorExpression: 4553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorDirective: 4563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TypeQualifiers: { 4573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //Only Clang results should be accepted, so we'll set all of the other 4583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //context bits to 0 (i.e. the empty set) 4593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unexposed; 4603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Recovery: { 4633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We don't know what the current context is, so we'll return unknown 4643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //This is the equivalent of setting all of the other context bits 4653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unknown; 4663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return contexts; 4703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 4713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 4721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 4731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 4741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 4755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXCompletionResult, 16> StoredResults; 476e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TU; 4771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 478e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults(AllocatedCXCodeCompleteResults &Results, 479e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TranslationUnit) 4808071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor : CodeCompleteConsumer(true, false, true, false), 481e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults(Results), TU(TranslationUnit) { } 48232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor ~CaptureCompletionResults() { Finish(); } 48332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 484e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 485e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 4860a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 4871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 48832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumResults); 4891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(S, 492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 49332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 49432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 49532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 49632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 49732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 4981abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 4993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 500e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CodeCompletionContext::Kind contextKind = Context.getKind(); 501e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 502e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContextKind = contextKind; 503e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.Contexts = getContextsForContextKind(contextKind, S); 504e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5050a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector = ""; 5060a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (Context.getNumSelIdents() > 0) { 5070a47d69af8bda945352997af3da4687a3356096aDouglas Gregor for (unsigned i = 0; i < Context.getNumSelIdents(); i++) { 5080a47d69af8bda945352997af3da4687a3356096aDouglas Gregor IdentifierInfo *selIdent = Context.getSelIdents()[i]; 5090a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (selIdent != NULL) { 5100a47d69af8bda945352997af3da4687a3356096aDouglas Gregor StringRef selectorString = Context.getSelIdents()[i]->getName(); 511a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer AllocatedResults.Selector += selectorString; 5120a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5130a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector += ":"; 5140a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5150a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5160a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 517e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType baseType = Context.getBaseType(); 518e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NamedDecl *D = NULL; 519e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 520e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!baseType.isNull()) { 521e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the declaration for a class/struct/union/enum type 522e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (const TagType *Tag = baseType->getAs<TagType>()) 523e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Tag->getDecl(); 524e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for a (possibly-qualified) Objective-C 525e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // object pointer type, e.g., NSString* 526e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectPointerType *ObjPtr = 527e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<ObjCObjectPointerType>()) 528e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = ObjPtr->getInterfaceDecl(); 529e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for an Objective-C object type 530e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectType *Obj = baseType->getAs<ObjCObjectType>()) 531e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Obj->getInterface(); 532e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the class for a C++ injected-class-name 533e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const InjectedClassNameType *Injected = 534e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<InjectedClassNameType>()) 535e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Injected->getDecl(); 536e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 538e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (D != NULL) { 539e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursor cursor = cxcursor::MakeCXCursor(D, *TU); 540e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 541e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursorKind cursorKind = clang_getCursorKind(cursor); 542e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString cursorUSR = clang_getCursorUSR(cursor); 543e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 544e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = cursorKind; 545e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = cursorUSR; 546e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor const Type *type = baseType.getTypePtrOrNull(); 547e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (type != NULL) { 548e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = type->isIncompleteType(); 549e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 550e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 551e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 552e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 553e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 554e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 555e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = CXCursor_InvalidCode; 556e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = createCXString(""); 557e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 558e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5601e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 56132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 56232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 56332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 56432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 56532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 566218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, S, 568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 56932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 57032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 57132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 57232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 57332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 57432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 57532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 57632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 577dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor virtual CodeCompletionAllocator &getAllocator() { 578218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return AllocatedResults.CodeCompletionAllocator; 579218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 580218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 58132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 58232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 58332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 58432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 58532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 58632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 58732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 58832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 5891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 5901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 5911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 5921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 593b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 594b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 595b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 596b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 597b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 598b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 599b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 600b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 601b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 602b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 603b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 604b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 605b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 606b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 607b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 608b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 609b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 610b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 611b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 612b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 613b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 6141abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 6151abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 6161abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 6171abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6181abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 6211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 622a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek ASTUnit *AST = static_cast<ASTUnit *>(TU->TUData); 6231abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 624b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 6251abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 626593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 627593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 6281abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 6295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 6301abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 6315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 6321abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 6331abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 6341abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 6351abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 6361abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6371abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6381abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 6391abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 6401abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6411abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6421abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 6430d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults *Results = 6440d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson new AllocatedCXCodeCompleteResults(AST->getFileSystemOpts()); 6451abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 6461abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 64748601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 6481abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 649e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults Capture(*Results, &TU); 6501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6511abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 6521abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 653cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 654cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 655cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 656cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 6574f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->Diag, Results->LangOpts, *Results->SourceMgr, 6584f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->FileMgr, Results->Diagnostics, 6592283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 66048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 66148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // Keep a reference to the allocator used for cached global completions, so 66248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // that we can be sure that the memory used by our code completion strings 66348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // doesn't get freed due to subsequent reparses (while the code completion 66448601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // results are still active). 66548601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor Results->CachedCompletionAllocator = AST->getCachedCompletionAllocator(); 6661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 668ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 669da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 670da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 671da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 672da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<256> LogResult; 673da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 674da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 675da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 676da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 677da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 678da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 679da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 680da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 681da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 682da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 683da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 684da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 685da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 686da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 687da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 688da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 689da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 690da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 691da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 692da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<512> pchName; 693da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 694da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 695da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 696da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 697da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 698da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 6990a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (stat(pchName.str().c_str(), &stat_results) == 0) 700da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 701da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 702da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 703da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 704da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 705da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7062ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 7072ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 7082ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 7092ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 7102ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 7112ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 712da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 7132ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 7142ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 7152ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 716da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef res = os.str(); 718da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 719da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 720da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 721da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 722da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 723da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 724da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 725da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 726da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 727da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 728da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 729da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 730da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 731da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 732da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 733da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 734da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 735da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 736da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 737da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 738da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 739da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 740da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 741b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 742b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 743b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 744b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 745b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 746b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 747b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 748b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 749b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 750b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 751b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 752b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 753b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 754b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 755bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 756b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 757a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true); 758b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 7596df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 7606df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor PrintLibclangResourceUsage(TU); 761b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 762b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 763ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 764ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 765cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 766cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 767cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 768cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 769ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 770ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 771ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 772ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 773ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 774ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 775ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 776ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 77758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 778a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 779a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 780a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 781a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 782a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 783a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 784a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 785a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 786a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 787a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 788a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 789a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 790a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 791a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 792a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 793a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 794a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 795a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 796a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 797a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 798a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 7993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorunsigned long long 8003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorclang_codeCompleteGetContexts(CXCodeCompleteResults *ResultsIn) { 8013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor AllocatedCXCodeCompleteResults *Results 8023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 8033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (!Results) 8043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return 0; 8053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 8063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return Results->Contexts; 8073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 808a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 809e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregorenum CXCursorKind clang_codeCompleteGetContainerKind( 810e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCodeCompleteResults *ResultsIn, 811e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned *IsIncomplete) { 812e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 813e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 814e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 815e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return CXCursor_InvalidCode; 816e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 817e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (IsIncomplete != NULL) { 818e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor *IsIncomplete = Results->ContainerIsIncomplete; 819e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 820e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 821e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return Results->ContainerKind; 822e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 823e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 824e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas GregorCXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *ResultsIn) { 825e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 826e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 827e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 828e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(""); 829e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 830e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(clang_getCString(Results->ContainerUSR)); 831e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 8320a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8330a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8340a47d69af8bda945352997af3da4687a3356096aDouglas GregorCXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *ResultsIn) { 8350a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedCXCodeCompleteResults *Results = 8360a47d69af8bda945352997af3da4687a3356096aDouglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 8370a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (!Results) 8380a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(""); 8390a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8400a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(Results->Selector); 8410a47d69af8bda945352997af3da4687a3356096aDouglas Gregor} 842e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 843ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 8441e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 845c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 846c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 847c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 848c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 849c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 850c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 851c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 852c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 853c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 854c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 855c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 8565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void AppendToString(StringRef &Old, StringRef New, 857c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 858c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 859c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 860c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 861c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 862c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 863c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 864c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 865c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 866c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 867c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 868c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 869c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 870c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 871c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 872c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 873c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 874c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 875c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 8765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef GetTypedName(CodeCompletionString *String, 877c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 8785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Result; 879c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 880c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 881c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 882c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 883c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 884c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 885c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 886c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 887c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 8881e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 8891e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 8901e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 8911e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *X 893218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)XR.CompletionString; 894218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Y 895218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)YR.CompletionString; 8961e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 897c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> XBuffer; 8985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XText = GetTypedName(X, XBuffer); 899c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> YBuffer; 9005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YText = GetTypedName(Y, YBuffer); 9011e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 902c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 903c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 904c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 905c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 9061e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 9071e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 9081e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 9091e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 9101e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 911c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 9121aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 9131e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 9141e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 9151e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 9161e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 9171e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 9181e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 9191e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 9201e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 9211e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 922458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 923