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" 16f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "CIndexDiagnostic.h" 17b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "CLog.h" 18e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "CXCursor.h" 19baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek#include "CXString.h" 20f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "CXTranslationUnit.h" 21e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Decl.h" 22e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/DeclObjC.h" 23f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/AST/Type.h" 24b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.h" 25f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Basic/SourceManager.h" 261abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#include "clang/Frontend/ASTUnit.h" 27b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Frontend/CompilerInstance.h" 28936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 29ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang/Sema/CodeCompleteConsumer.h" 30df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/ADT/SmallString.h" 31ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/ADT/StringExtras.h" 321fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor#include "llvm/Support/Atomic.h" 33b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar#include "llvm/Support/CrashRecoveryContext.h" 34ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 35f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "llvm/Support/Program.h" 36df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 37df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 383d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 39f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include <cstdlib> 4090b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko#include <string> 41ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 42df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 43da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 44da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 45da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 46da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 47da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 48da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 49da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 50da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 51ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 52c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidisusing namespace clang::cxindex; 53ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 54ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 55ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 56ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 57ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 58ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 59218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 61ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 62ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 68ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 69ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 90ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 91ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 92ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 93ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 94ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 95ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 9601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 9701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 9801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 9901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 10001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 10101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 10201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 10301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 10401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 10501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 106ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 107ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1087530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CompletionKind!"); 109ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 110ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1112ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed KremenekCXString clang_getCompletionChunkText(CXCompletionString completion_string, 1122ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek unsigned chunk_number) { 113218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 114ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 115dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 116ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 117ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 119ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 120ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 121ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 122ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 123ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 124ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 125ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 126ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 127ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 128ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 129ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 130ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 131ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 132ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 13721c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor case CodeCompletionString::CK_VerticalSpace: 1380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return cxstring::createRef((*CCStr)[chunk_number].Text); 13921c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor 140ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 141ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 142dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko return cxstring::createEmpty(); 143ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 144ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1453026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid CodeCompletionString Kind!"); 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 1847530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CompletionKind!"); 185ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 186ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 187ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekunsigned clang_getNumCompletionChunks(CXCompletionString completion_string) { 188218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 189ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CCStr? CCStr->size() : 0; 190ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 191ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 19212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorunsigned clang_getCompletionPriority(CXCompletionString completion_string) { 193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 194a2ace58cf99f9279a7467d987c6094145dd19d8bBill Wendling return CCStr? CCStr->getPriority() : unsigned(CCP_Unlikely); 19512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 19612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 19758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorenum CXAvailabilityKind 19858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorclang_getCompletionAvailability(CXCompletionString completion_string) { 199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return CCStr? static_cast<CXAvailabilityKind>(CCStr->getAvailability()) 201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : CXAvailability_Available; 20258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor} 20358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 2046164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned clang_getCompletionNumAnnotations(CXCompletionString completion_string) 2056164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen{ 2066164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 2076164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return CCStr ? CCStr->getAnnotationCount() : 0; 2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik VerbruggenCXString clang_getCompletionAnnotation(CXCompletionString completion_string, 2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen unsigned annotation_number) { 2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 2130c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return CCStr ? cxstring::createRef(CCStr->getAnnotation(annotation_number)) 214dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko : cxstring::createNull(); 2156164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2166164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 217ba1030698dbc276db86b11c5329a1edee8a1805eDouglas GregorCXString 218ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregorclang_getCompletionParent(CXCompletionString completion_string, 219ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursorKind *kind) { 220ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (kind) 221ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor *kind = CXCursor_NotImplemented; 222ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 223ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 224ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (!CCStr) 225dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 226ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2275595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createRef(CCStr->getParentContextName()); 228ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor} 229d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 230d99ef536b241071b6f4c01db6525dc03242ac30bDmitri GribenkoCXString 231d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenkoclang_getCompletionBriefComment(CXCompletionString completion_string) { 232d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 233d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 234d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (!CCStr) 235dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 236d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 2370c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return cxstring::createRef(CCStr->getBriefComment()); 238d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko} 239d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 2404d9f4e5bfa701fc870e3c481f93f1fcc52d327bbBenjamin Kramernamespace { 2414d9f4e5bfa701fc870e3c481f93f1fcc52d327bbBenjamin Kramer 242ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 243ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 24490b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko/// 24590b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko/// Normally, clients of CXString shouldn't care whether or not a CXString is 24690b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko/// managed by a pool or by explicitly malloc'ed memory. But 24790b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko/// AllocatedCXCodeCompleteResults outlives the CXTranslationUnit, so we can 24890b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko/// not rely on the StringPool in the TU. 249ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2500d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults(const FileSystemOptions& FileSystemOpts); 2510a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2520a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 253a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 2545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StoredDiagnostic, 8> Diagnostics; 255a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 25602c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; 25702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor 258f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 259c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> Diag; 260f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 261a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 26235b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 263389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 264389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 265389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 26639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner /// \brief File manager, used for diagnostics. 267c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<FileManager> FileMgr; 26839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 269389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 270c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<SourceManager> SourceMgr; 271313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 272313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 273313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 274313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 275b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 2767ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// \brief Temporary buffers that will be deleted once we have finished with 2777ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// the code-completion results. 2785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 28048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor /// \brief Allocator used to store globally cached code-completion results. 281c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<clang::GlobalCodeCompletionAllocator> 28248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor CachedCompletionAllocator; 28348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Allocator used to store code completion results. 28528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis IntrusiveRefCntPtr<clang::GlobalCodeCompletionAllocator> 28628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator; 2873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief Context under which completion occurred. 2893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum clang::CodeCompletionContext::Kind ContextKind; 2903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief A bitfield representing the acceptable completions for the 2923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// current context. 2933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long Contexts; 294e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 2950a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The kind of the container for the current context for completions. 296e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CXCursorKind ContainerKind; 29790b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 2980a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The USR of the container for the current context for completions. 29990b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko std::string ContainerUSR; 30090b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 3010a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief a boolean value indicating whether there is complete information 3020a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// about the container 303e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned ContainerIsIncomplete; 3040a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 3050a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief A string containing the Objective-C selector entered thus far for a 3060a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// message send. 3070a47d69af8bda945352997af3da4687a3356096aDouglas Gregor std::string Selector; 308ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 309ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 3104d9f4e5bfa701fc870e3c481f93f1fcc52d327bbBenjamin Kramer} // end anonymous namespace 3114d9f4e5bfa701fc870e3c481f93f1fcc52d327bbBenjamin Kramer 312e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// \brief Tracks the number of code-completion result objects that are 313e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// currently active. 314e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// 315e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// Used for debugging purposes only. 3161fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregorstatic llvm::sys::cas_flag CodeCompletionResultObjects; 317e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 3180d8d7e6067f9093e7d5abc45c9639ab977aab692Anders CarlssonAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults( 3190d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson const FileSystemOptions& FileSystemOpts) 32033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : CXCodeCompleteResults(), 32102c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor DiagOpts(new DiagnosticOptions), 322d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie Diag(new DiagnosticsEngine( 32302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), 32402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor &*DiagOpts)), 3250d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson FileSystemOpts(FileSystemOpts), 3264f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr(new FileManager(FileSystemOpts)), 327b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor SourceMgr(new SourceManager(*Diag, *FileMgr)), 32828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator(new clang::GlobalCodeCompletionAllocator), 329b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor Contexts(CXCompletionContext_Unknown), 330b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerKind(CXCursor_InvalidCode), 331b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerIsIncomplete(1) 332b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor{ 333e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 3341fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicIncrement(&CodeCompletionResultObjects); 335e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "+++ %d completion results\n", CodeCompletionResultObjects); 336e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 337e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor} 3380a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3390a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 3400a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 34190b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 342313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 343313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 344b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 345b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 346e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 347e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 3481fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicDecrement(&CodeCompletionResultObjects); 349e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "--- %d completion results\n", CodeCompletionResultObjects); 350e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 3510a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 3520a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 3541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorstatic unsigned long long getContextsForContextKind( 3563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind, 3573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor Sema &S) { 3583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long contexts = 0; 3593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor switch (kind) { 3603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_OtherWithMacros: { 3613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We can allow macros here, but we don't know what else is permissible 3623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //So we'll say the only thing permissible are macros 3633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 3643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TopLevel: 3673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCIvarList: 3683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassStructUnion: 3693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Type: { 3703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3724e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 3733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Statement: { 3823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 3854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 3863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Expression: { 3953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyValue; 3964e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 3973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_AnyType | 3983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 4003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: { 4083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCObjectValue | 4093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCSelectorValue | 4103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 4114e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 4123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_CXXClassTypeValue | 4133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyType | 4143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 4153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_DotMemberAccess: { 4233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_DotMemberAccess; 4243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ArrowMemberAccess: { 4273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ArrowMemberAccess; 4283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCPropertyAccess: { 4313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCPropertyAccess; 4323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_EnumTag: { 4353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_EnumTag | 4363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_UnionTag: { 4403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_UnionTag | 4413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassOrStructTag: { 4453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_StructTag | 4463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCProtocolName: { 4513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCProtocol; 4523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Namespace: { 4553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Namespace; 4563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PotentiallyQualifiedName: { 4593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NestedNameSpecifier; 4603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroNameUse: { 4633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 4643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_NaturalLanguage: { 4673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NaturalLanguage; 4683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_SelectorName: { 4713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCSelectorName; 4723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: { 4753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 4763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 4773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 4784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus) { 4793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 4803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInstanceMessage: { 4883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInstanceMessage; 4893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCClassMessage: { 4923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCClassMessage; 4933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4950f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CodeCompletionContext::CCC_ObjCInterfaceName: { 4963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInterface; 4973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCCategoryName: { 5003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCCategory; 5013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 5023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 5033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Other: 5043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInterface: 5053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCImplementation: 5063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Name: 5073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroName: 5083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorExpression: 5093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorDirective: 5103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TypeQualifiers: { 5113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //Only Clang results should be accepted, so we'll set all of the other 5123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //context bits to 0 (i.e. the empty set) 5133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unexposed; 5143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 5153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 5163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Recovery: { 5173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We don't know what the current context is, so we'll return unknown 5183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //This is the equivalent of setting all of the other context bits 5193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unknown; 5203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 5213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 5223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 5233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return contexts; 5243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 5253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 5261abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 5271abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 5281abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 52928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo CCTUInfo; 5305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXCompletionResult, 16> StoredResults; 531e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TU; 5321abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 533d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CaptureCompletionResults(const CodeCompleteOptions &Opts, 534d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko AllocatedCXCodeCompleteResults &Results, 535e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TranslationUnit) 536d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko : CodeCompleteConsumer(Opts, false), 53728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis AllocatedResults(Results), CCTUInfo(Results.CodeCompletionAllocator), 53828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis TU(TranslationUnit) { } 53932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor ~CaptureCompletionResults() { Finish(); } 54032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 541e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 542e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 5430a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 5441abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 54532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumResults); 5461abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 547218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 54828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Results[I].CreateCodeCompletionString(S, getAllocator(), 549d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko getCodeCompletionTUInfo(), 550d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko includeBriefComments()); 55132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 55232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 55332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 55432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 55532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 5561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 558e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CodeCompletionContext::Kind contextKind = Context.getKind(); 559e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 560e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContextKind = contextKind; 561e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.Contexts = getContextsForContextKind(contextKind, S); 562e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5630a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector = ""; 5640a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (Context.getNumSelIdents() > 0) { 5650a47d69af8bda945352997af3da4687a3356096aDouglas Gregor for (unsigned i = 0; i < Context.getNumSelIdents(); i++) { 5660a47d69af8bda945352997af3da4687a3356096aDouglas Gregor IdentifierInfo *selIdent = Context.getSelIdents()[i]; 5670a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (selIdent != NULL) { 5680a47d69af8bda945352997af3da4687a3356096aDouglas Gregor StringRef selectorString = Context.getSelIdents()[i]->getName(); 569a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer AllocatedResults.Selector += selectorString; 5700a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5710a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector += ":"; 5720a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5730a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5740a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 575e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType baseType = Context.getBaseType(); 576e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NamedDecl *D = NULL; 577e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 578e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!baseType.isNull()) { 579e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the declaration for a class/struct/union/enum type 580e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (const TagType *Tag = baseType->getAs<TagType>()) 581e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Tag->getDecl(); 582e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for a (possibly-qualified) Objective-C 583e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // object pointer type, e.g., NSString* 584e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectPointerType *ObjPtr = 585e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<ObjCObjectPointerType>()) 586e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = ObjPtr->getInterfaceDecl(); 587e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for an Objective-C object type 588e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectType *Obj = baseType->getAs<ObjCObjectType>()) 589e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Obj->getInterface(); 590e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the class for a C++ injected-class-name 591e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const InjectedClassNameType *Injected = 592e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<InjectedClassNameType>()) 593e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Injected->getDecl(); 594e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 596e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (D != NULL) { 597e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursor cursor = cxcursor::MakeCXCursor(D, *TU); 59890b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 59990b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko AllocatedResults.ContainerKind = clang_getCursorKind(cursor); 60090b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 60190b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko CXString CursorUSR = clang_getCursorUSR(cursor); 60290b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko AllocatedResults.ContainerUSR = clang_getCString(CursorUSR); 60390b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko clang_disposeString(CursorUSR); 60490b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 605e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor const Type *type = baseType.getTypePtrOrNull(); 606e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (type != NULL) { 607e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = type->isIncompleteType(); 608e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 609e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 610e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 611e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 612e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 613e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 614e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = CXCursor_InvalidCode; 61590b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko AllocatedResults.ContainerUSR.clear(); 616e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 617e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 6181abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6191e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 62032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 62132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 62232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 62332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 62432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 62628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis = Candidates[I].CreateSignatureString(CurrentArg, S, getAllocator(), 62728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis getCodeCompletionTUInfo()); 62832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 62932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 63032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 63132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 63232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 63332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 63432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 63532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 636dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor virtual CodeCompletionAllocator &getAllocator() { 63728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return *AllocatedResults.CodeCompletionAllocator; 638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 63928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 64028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis virtual CodeCompletionTUInfo &getCodeCompletionTUInfo() { return CCTUInfo; } 641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 64232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 64332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 64432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 64532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 64632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 64732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 64832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 64932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 6501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 6511abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 6521abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 654b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 655b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 656b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 657b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 658b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 659b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 660b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 661b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 662b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 663b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 664b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 665b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 666b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 667b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 668b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 669b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 670b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 671b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 672b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 673d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko bool IncludeBriefComments = options & CXCodeComplete_IncludeBriefComments; 674b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 675b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 6761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 6771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 6781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 6791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 6831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6845694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko ASTUnit *AST = cxtu::getASTUnit(TU); 6851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 686b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 6871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6888c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko CIndexer *CXXIdx = TU->CIdx; 689fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 69081b5ac39a97cde1a54b8d0eb7105290c40eb84d7Argyrios Kyrtzidis setThreadBackgroundPriority(); 691fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 692593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 693593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 6941abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 6955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 6961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 6975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 6981abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 6991abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 7001abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 7011abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 7021abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 7031abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 7041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 7051abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 7061abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 7071abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 7081abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 7090d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults *Results = 7100d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson new AllocatedCXCodeCompleteResults(AST->getFileSystemOpts()); 7111abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 7121abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 71348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 7141abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 715d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompleteOptions Opts; 716d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Opts.IncludeBriefComments = IncludeBriefComments; 717d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CaptureCompletionResults Capture(Opts, *Results, &TU); 7181abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 7191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 7201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 721cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 722cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 723cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 724d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko IncludeBriefComments, 725cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 7264f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->Diag, Results->LangOpts, *Results->SourceMgr, 7274f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->FileMgr, Results->Diagnostics, 7282283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 72948601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 73048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // Keep a reference to the allocator used for cached global completions, so 73148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // that we can be sure that the memory used by our code completion strings 73248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // doesn't get freed due to subsequent reparses (while the code completion 73348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // results are still active). 73448601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor Results->CachedCompletionAllocator = AST->getCachedCompletionAllocator(); 7351abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 7361abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 737ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 738da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 739da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 740da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 74136d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> LogResult; 742da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 743da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 744da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 745da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 746da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 747da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 748da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 749da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 750da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 751da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 752da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 753da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 754da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 755da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 756da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 757da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 758da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 759da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 760da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 76136d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<512> pchName; 762da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 763da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 764da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 765da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 766da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 767da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 7680a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (stat(pchName.str().c_str(), &stat_results) == 0) 769da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 770da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 771da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 772da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 773da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 774da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7752ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 7762ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 7772ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 7782ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 7792ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 7802ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 781da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 7822ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 7832ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 7842ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 785da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef res = os.str(); 787da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 788da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 789da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 790da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 791da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 792da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 793da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 794da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 795da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 796da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 797da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 798da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 799da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 800da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 801da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 802da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 803da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 804da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 805da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 806da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 807da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 808da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 809da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 810b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 811b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 812b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 813b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 814b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 815b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 816b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 817b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 818b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 819c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis LOG_FUNC_SECTION { 820c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis *Log << TU << ' ' 821c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis << complete_filename << ':' << complete_line << ':' << complete_column; 822c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis } 823c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis 824b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 825b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 826b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 827772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis 828772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis if (getenv("LIBCLANG_NOTHREADS")) { 829772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis clang_codeCompleteAt_Impl(&CCAI); 830772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis return CCAI.result; 831772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis } 832772e71310bd06a30b81db981cb5d9cc20120ff83Argyrios Kyrtzidis 833b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 834b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 835bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 836b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 8375694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko cxtu::getASTUnit(TU)->setUnsafeToFree(true); 838b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 8396df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 8406df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor PrintLibclangResourceUsage(TU); 841b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 842b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 843ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 844ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 845cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 846cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 847cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 848cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 849ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 850ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 851ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 852ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 853ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 854ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 855ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 856ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 85758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 858a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 859a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 860a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 861a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 862a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 863a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 864a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 865a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 866a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 867a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 868a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 869a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 870a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 871a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 872a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 873a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 874a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 875a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 876a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 877a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 878a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 8793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorunsigned long long 8803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorclang_codeCompleteGetContexts(CXCodeCompleteResults *ResultsIn) { 8813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor AllocatedCXCodeCompleteResults *Results 8823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 8833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (!Results) 8843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return 0; 8853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 8863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return Results->Contexts; 8873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 888a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 889e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregorenum CXCursorKind clang_codeCompleteGetContainerKind( 890e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCodeCompleteResults *ResultsIn, 891e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned *IsIncomplete) { 892e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 893e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 894e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 895e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return CXCursor_InvalidCode; 896e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 897e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (IsIncomplete != NULL) { 898e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor *IsIncomplete = Results->ContainerIsIncomplete; 899e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 900e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 901e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return Results->ContainerKind; 902e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 903e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 904e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas GregorCXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *ResultsIn) { 905e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 906e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 907e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 908dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko return cxstring::createEmpty(); 90990b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko 91090b5ac660ef96b9d59dff837e96fd72d0673d7deDmitri Gribenko return cxstring::createRef(Results->ContainerUSR.c_str()); 911e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 9120a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 9130a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 9140a47d69af8bda945352997af3da4687a3356096aDouglas GregorCXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *ResultsIn) { 9150a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedCXCodeCompleteResults *Results = 9160a47d69af8bda945352997af3da4687a3356096aDouglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 9170a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (!Results) 918dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko return cxstring::createEmpty(); 9190a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 9205595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createDup(Results->Selector); 9210a47d69af8bda945352997af3da4687a3356096aDouglas Gregor} 922e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 923ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 9241e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 925c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 926c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 927c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 928c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 929c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 930c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 931c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 932c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 933c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 934c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 935c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 9365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void AppendToString(StringRef &Old, StringRef New, 93736d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> &Buffer) { 938c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 939c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 940c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 941c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 942c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 943c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 944c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 945c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 946c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 947c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 948c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 949c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 950c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 951c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 952c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 953c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 954c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 955c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 9565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef GetTypedName(CodeCompletionString *String, 95736d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> &Buffer) { 9585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Result; 959c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 960c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 961c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 962c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 963c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 964c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 965c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 966c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 967c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 9681e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 9691e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 9701e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 9711e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 972218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *X 973218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)XR.CompletionString; 974218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Y 975218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)YR.CompletionString; 9761e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 97736d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> XBuffer; 9785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XText = GetTypedName(X, XBuffer); 97936d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> YBuffer; 9805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YText = GetTypedName(Y, YBuffer); 9811e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 982c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 983c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 984c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 985c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 9861e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 9871e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 9881e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 9891e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 9901e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 991c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 9921aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 9931e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 9941e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 9951e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 9961e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 9971e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 9981e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 9991e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 10001e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 10011e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 1002458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 1003