CIndexCodeCompletion.cpp revision 7530c034c0c71a64c5a9173206d9742ae847af8b
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" 19baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek#include "CXString.h" 20936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "CIndexDiagnostic.h" 21e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Type.h" 22e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Decl.h" 23e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/DeclObjC.h" 24b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/SourceManager.h" 25b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.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" 35df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 36df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 3703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 383d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdlib> 393d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 40ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 41df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 42da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 43da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 44da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 45da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 46da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 47da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 48da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 49da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 50ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 512ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenekusing namespace clang::cxstring; 52ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 53ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 54ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 55ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 56ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 57ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 58218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 59ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 61ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 62ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 68ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 69ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 90ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 91ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 92ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 93ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 94ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 9501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 9601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 9701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 9801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 9901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 10001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 10101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 10201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 10301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 10401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 105ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 106ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1077530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CompletionKind!"); 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 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; 2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return CCStr ? createCXString(CCStr->getAnnotation(annotation_number)) 2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen : createCXString((const char *) 0); 2156164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2166164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2176164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 218ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 219ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 220ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2210d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults(const FileSystemOptions& FileSystemOpts); 2220a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2230a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 224a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 2255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StoredDiagnostic, 8> Diagnostics; 226a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 227f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 228d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie llvm::IntrusiveRefCntPtr<DiagnosticsEngine> Diag; 229f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 230a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 23135b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 232389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 233389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 234389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 23539b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner /// \brief File manager, used for diagnostics. 2364f32786ac45210143654390177105eb749b614e9Ted Kremenek llvm::IntrusiveRefCntPtr<FileManager> FileMgr; 23739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 238389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 2394f32786ac45210143654390177105eb749b614e9Ted Kremenek llvm::IntrusiveRefCntPtr<SourceManager> SourceMgr; 240313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 241313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 242313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 243313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 244b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 2457ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// \brief Temporary buffers that will be deleted once we have finished with 2467ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// the code-completion results. 2475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 24948601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor /// \brief Allocator used to store globally cached code-completion results. 25048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor llvm::IntrusiveRefCntPtr<clang::GlobalCodeCompletionAllocator> 25148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor CachedCompletionAllocator; 25248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Allocator used to store code completion results. 254110a68e38bb37526f9bd1d4e8f1b941fe5410b27Douglas Gregor clang::CodeCompletionAllocator CodeCompletionAllocator; 2553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief Context under which completion occurred. 2573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum clang::CodeCompletionContext::Kind ContextKind; 2583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief A bitfield representing the acceptable completions for the 2603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// current context. 2613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long Contexts; 262e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 2630a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The kind of the container for the current context for completions. 264e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CXCursorKind ContainerKind; 2650a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The USR of the container for the current context for completions. 266e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString ContainerUSR; 2670a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief a boolean value indicating whether there is complete information 2680a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// about the container 269e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned ContainerIsIncomplete; 2700a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 2710a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief A string containing the Objective-C selector entered thus far for a 2720a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// message send. 2730a47d69af8bda945352997af3da4687a3356096aDouglas Gregor std::string Selector; 274ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 275ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 276e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// \brief Tracks the number of code-completion result objects that are 277e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// currently active. 278e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// 279e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// Used for debugging purposes only. 2801fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregorstatic llvm::sys::cas_flag CodeCompletionResultObjects; 281e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 2820d8d7e6067f9093e7d5abc45c9639ab977aab692Anders CarlssonAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults( 2830d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson const FileSystemOptions& FileSystemOpts) 28433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : CXCodeCompleteResults(), 285d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie Diag(new DiagnosticsEngine( 28633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs))), 2870d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson FileSystemOpts(FileSystemOpts), 2884f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr(new FileManager(FileSystemOpts)), 289b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor SourceMgr(new SourceManager(*Diag, *FileMgr)), 290b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor Contexts(CXCompletionContext_Unknown), 291b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerKind(CXCursor_InvalidCode), 292b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerUSR(createCXString("")), 293b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerIsIncomplete(1) 294b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor{ 295e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2961fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicIncrement(&CodeCompletionResultObjects); 297e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "+++ %d completion results\n", CodeCompletionResultObjects); 298e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 299e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor} 3000a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3010a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 3020a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 303313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 304e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor clang_disposeString(ContainerUSR); 305e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 306313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 307313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 308b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 309b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 310e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 311e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 3121fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicDecrement(&CodeCompletionResultObjects); 313e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "--- %d completion results\n", CodeCompletionResultObjects); 314e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 3150a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 3160a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3171abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 3181abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorstatic unsigned long long getContextsForContextKind( 3203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind, 3213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor Sema &S) { 3223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long contexts = 0; 3233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor switch (kind) { 3243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_OtherWithMacros: { 3253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We can allow macros here, but we don't know what else is permissible 3263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //So we'll say the only thing permissible are macros 3273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 3283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TopLevel: 3313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCIvarList: 3323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassStructUnion: 3333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Type: { 3343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Statement: { 3463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 3493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Expression: { 3593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyValue; 3603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_AnyType | 3623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: { 3723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCObjectValue | 3733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCSelectorValue | 3743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_CXXClassTypeValue | 3773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyType | 3783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_DotMemberAccess: { 3873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_DotMemberAccess; 3883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ArrowMemberAccess: { 3913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ArrowMemberAccess; 3923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCPropertyAccess: { 3953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCPropertyAccess; 3963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_EnumTag: { 3993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_EnumTag | 4003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_UnionTag: { 4043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_UnionTag | 4053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassOrStructTag: { 4093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_StructTag | 4103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCProtocolName: { 4153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCProtocol; 4163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Namespace: { 4193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Namespace; 4203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PotentiallyQualifiedName: { 4233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NestedNameSpecifier; 4243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroNameUse: { 4273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 4283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_NaturalLanguage: { 4313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NaturalLanguage; 4323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_SelectorName: { 4353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCSelectorName; 4363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: { 4393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 4403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 4413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 4423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 4433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 4443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInstanceMessage: { 4523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInstanceMessage; 4533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCClassMessage: { 4563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCClassMessage; 4573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4590f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CodeCompletionContext::CCC_ObjCInterfaceName: { 4603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInterface; 4613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCCategoryName: { 4643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCCategory; 4653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Other: 4683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInterface: 4693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCImplementation: 4703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Name: 4713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroName: 4723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorExpression: 4733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorDirective: 4743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TypeQualifiers: { 4753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //Only Clang results should be accepted, so we'll set all of the other 4763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //context bits to 0 (i.e. the empty set) 4773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unexposed; 4783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Recovery: { 4813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We don't know what the current context is, so we'll return unknown 4823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //This is the equivalent of setting all of the other context bits 4833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unknown; 4843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return contexts; 4883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 4893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 4901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 4911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 4921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 4935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXCompletionResult, 16> StoredResults; 494e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TU; 4951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 496e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults(AllocatedCXCodeCompleteResults &Results, 497e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TranslationUnit) 4988071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor : CodeCompleteConsumer(true, false, true, false), 499e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults(Results), TU(TranslationUnit) { } 50032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor ~CaptureCompletionResults() { Finish(); } 50132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 502e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 503e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 5040a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 5051abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 50632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumResults); 5071abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(S, 510218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 51132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 51232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 51332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 51432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 51532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 5161abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 518e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CodeCompletionContext::Kind contextKind = Context.getKind(); 519e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 520e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContextKind = contextKind; 521e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.Contexts = getContextsForContextKind(contextKind, S); 522e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5230a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector = ""; 5240a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (Context.getNumSelIdents() > 0) { 5250a47d69af8bda945352997af3da4687a3356096aDouglas Gregor for (unsigned i = 0; i < Context.getNumSelIdents(); i++) { 5260a47d69af8bda945352997af3da4687a3356096aDouglas Gregor IdentifierInfo *selIdent = Context.getSelIdents()[i]; 5270a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (selIdent != NULL) { 5280a47d69af8bda945352997af3da4687a3356096aDouglas Gregor StringRef selectorString = Context.getSelIdents()[i]->getName(); 529a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer AllocatedResults.Selector += selectorString; 5300a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5310a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector += ":"; 5320a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5330a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5340a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 535e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType baseType = Context.getBaseType(); 536e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NamedDecl *D = NULL; 537e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 538e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!baseType.isNull()) { 539e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the declaration for a class/struct/union/enum type 540e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (const TagType *Tag = baseType->getAs<TagType>()) 541e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Tag->getDecl(); 542e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for a (possibly-qualified) Objective-C 543e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // object pointer type, e.g., NSString* 544e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectPointerType *ObjPtr = 545e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<ObjCObjectPointerType>()) 546e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = ObjPtr->getInterfaceDecl(); 547e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for an Objective-C object type 548e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectType *Obj = baseType->getAs<ObjCObjectType>()) 549e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Obj->getInterface(); 550e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the class for a C++ injected-class-name 551e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const InjectedClassNameType *Injected = 552e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<InjectedClassNameType>()) 553e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Injected->getDecl(); 554e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 556e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (D != NULL) { 557e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursor cursor = cxcursor::MakeCXCursor(D, *TU); 558e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 559e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursorKind cursorKind = clang_getCursorKind(cursor); 560e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString cursorUSR = clang_getCursorUSR(cursor); 561e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 562baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // Normally, clients of CXString shouldn't care whether or not 563baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // a CXString is managed by a pool or by explicitly malloc'ed memory. 564baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // However, there are cases when AllocatedResults outlives the 565baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // CXTranslationUnit. This is a workaround that failure mode. 566baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek if (cxstring::isManagedByPool(cursorUSR)) { 567baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek CXString heapStr = 568baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek cxstring::createCXString(clang_getCString(cursorUSR), true); 569baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek clang_disposeString(cursorUSR); 570baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek cursorUSR = heapStr; 571baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek } 572baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek 573e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = cursorKind; 574e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = cursorUSR; 575baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek 576e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor const Type *type = baseType.getTypePtrOrNull(); 577e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (type != NULL) { 578e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = type->isIncompleteType(); 579e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 580e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 581e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 582e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 583e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 584e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 585e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = CXCursor_InvalidCode; 586e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = createCXString(""); 587e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 588e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5901e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 59132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 59232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 59332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 59432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 59532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 597218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, S, 598218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 59932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 60032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 60132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 60232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 60332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 60432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 60532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 60632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 607dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor virtual CodeCompletionAllocator &getAllocator() { 608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return AllocatedResults.CodeCompletionAllocator; 609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 61132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 61232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 61332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 61432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 61532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 61632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 61732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 61832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 6191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 6201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 6211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6221abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 623b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 624b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 625b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 626b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 627b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 628b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 629b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 630b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 631b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 632b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 633b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 634b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 635b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 636b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 637b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 638b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 639b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 640b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 641b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 642b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 643b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 6441abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 6451abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 6461abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 6471abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6481abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6491abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 6511abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 652a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek ASTUnit *AST = static_cast<ASTUnit *>(TU->TUData); 6531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 654b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 6551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 656593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 657593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 6581abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 6595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 6601abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 6615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 6621abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 6631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 6641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 6651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 6661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 6691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 6701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 6730d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults *Results = 6740d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson new AllocatedCXCodeCompleteResults(AST->getFileSystemOpts()); 6751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 6761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 67748601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 6781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 679e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults Capture(*Results, &TU); 6801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 6821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 683cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 684cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 685cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 686cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 6874f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->Diag, Results->LangOpts, *Results->SourceMgr, 6884f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->FileMgr, Results->Diagnostics, 6892283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 69048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 69148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // Keep a reference to the allocator used for cached global completions, so 69248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // that we can be sure that the memory used by our code completion strings 69348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // doesn't get freed due to subsequent reparses (while the code completion 69448601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // results are still active). 69548601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor Results->CachedCompletionAllocator = AST->getCachedCompletionAllocator(); 6961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6971abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 698ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 699da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 700da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 701da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 702da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<256> LogResult; 703da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 704da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 705da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 706da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 707da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 708da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 709da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 710da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 711da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 712da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 713da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 714da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 715da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 716da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 717da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 718da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 719da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 720da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 721da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 722da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<512> pchName; 723da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 724da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 725da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 726da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 727da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 728da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 7290a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (stat(pchName.str().c_str(), &stat_results) == 0) 730da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 731da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 732da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 733da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 734da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 735da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7362ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 7372ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 7382ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 7392ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 7402ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 7412ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 742da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 7432ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 7442ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 7452ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 746da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef res = os.str(); 748da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 749da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 750da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 751da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 752da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 753da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 754da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 755da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 756da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 757da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 758da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 759da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 760da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 761da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 762da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 763da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 764da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 765da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 766da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 767da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 768da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 769da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 770da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 771b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 772b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 773b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 774b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 775b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 776b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 777b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 778b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 779b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 780b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 781b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 782b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 783b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 784b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 785bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 786b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 787a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true); 788b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 7896df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 7906df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor PrintLibclangResourceUsage(TU); 791b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 792b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 793ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 794ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 795cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 796cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 797cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 798cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 799ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 800ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 801ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 802ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 803ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 804ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 805ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 806ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 80758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 808a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 809a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 810a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 811a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 812a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 813a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 814a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 815a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 816a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 817a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 818a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 819a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 820a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 821a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 822a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 823a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 824a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 825a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 826a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 827a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 828a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 8293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorunsigned long long 8303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorclang_codeCompleteGetContexts(CXCodeCompleteResults *ResultsIn) { 8313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor AllocatedCXCodeCompleteResults *Results 8323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 8333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (!Results) 8343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return 0; 8353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 8363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return Results->Contexts; 8373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 838a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 839e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregorenum CXCursorKind clang_codeCompleteGetContainerKind( 840e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCodeCompleteResults *ResultsIn, 841e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned *IsIncomplete) { 842e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 843e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 844e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 845e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return CXCursor_InvalidCode; 846e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 847e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (IsIncomplete != NULL) { 848e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor *IsIncomplete = Results->ContainerIsIncomplete; 849e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 850e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 851e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return Results->ContainerKind; 852e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 853e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 854e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas GregorCXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *ResultsIn) { 855e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 856e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 857e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 858e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(""); 859e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 860e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(clang_getCString(Results->ContainerUSR)); 861e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 8620a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8630a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8640a47d69af8bda945352997af3da4687a3356096aDouglas GregorCXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *ResultsIn) { 8650a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedCXCodeCompleteResults *Results = 8660a47d69af8bda945352997af3da4687a3356096aDouglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 8670a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (!Results) 8680a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(""); 8690a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8700a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(Results->Selector); 8710a47d69af8bda945352997af3da4687a3356096aDouglas Gregor} 872e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 873ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 8741e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 875c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 876c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 877c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 878c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 879c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 880c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 881c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 882c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 883c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 884c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 885c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 8865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void AppendToString(StringRef &Old, StringRef New, 887c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 888c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 889c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 890c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 891c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 892c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 893c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 894c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 895c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 896c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 897c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 898c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 899c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 900c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 901c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 902c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 903c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 904c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 905c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 9065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef GetTypedName(CodeCompletionString *String, 907c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 9085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Result; 909c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 910c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 911c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 912c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 913c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 914c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 915c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 916c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 917c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 9181e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 9191e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 9201e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 9211e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 922218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *X 923218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)XR.CompletionString; 924218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Y 925218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)YR.CompletionString; 9261e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 927c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> XBuffer; 9285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XText = GetTypedName(X, XBuffer); 929c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> YBuffer; 9305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YText = GetTypedName(Y, YBuffer); 9311e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 932c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 933c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 934c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 935c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 9361e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 9371e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 9381e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 9391e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 9401e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 941c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 9421aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 9431e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 9441e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 9451e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 9461e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 9471e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 9481e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 9491e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 9501e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 9511e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 952458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 953