CIndexCodeCompletion.cpp revision 218937c13ef5b0625a70aad41ca7a92da9278bd2
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" 18936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "CIndexDiagnostic.h" 19b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/SourceManager.h" 20b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.h" 211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#include "clang/Frontend/ASTUnit.h" 22b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Frontend/CompilerInstance.h" 23936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 24ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang/Sema/CodeCompleteConsumer.h" 25df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/ADT/SmallString.h" 26ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/ADT/StringExtras.h" 271fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor#include "llvm/Support/Atomic.h" 28b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar#include "llvm/Support/CrashRecoveryContext.h" 29ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 30df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 31df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 3203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 333d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdlib> 343d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 35ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 36df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 37da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 38da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 39da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 40da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 41da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 42da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 43da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 44da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 45ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 462ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenekusing namespace clang::cxstring; 47ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 48ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 49ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 50ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 51ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 52ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 53218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 54ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 55ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 56ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 57ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 58ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 59ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 61ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 62ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 68ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 69ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 9001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 9101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 9201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 9301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 9401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 9501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 9601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 9701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 9801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 9901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 100ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 101ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 102ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 103ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 104ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 105ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1062ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed KremenekCXString clang_getCompletionChunkText(CXCompletionString completion_string, 1072ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek unsigned chunk_number) { 108218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 109ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 110a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek return createCXString((const char*)0); 111ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 112ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 113ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 114ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 115ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 116ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 117ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 119ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 120ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 121ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 122ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 123ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 124ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 125ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 126ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 127ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 12801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 12901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 13001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 13101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 13221c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor case CodeCompletionString::CK_VerticalSpace: 1335a9c0bca4504eeda45a3fd0ae1c244b2994f38b2Douglas Gregor return createCXString((*CCStr)[chunk_number].Text, false); 13421c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor 135ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 136ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 1372ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(""); 138ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 139ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 140ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 141a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek return createCXString((const char*)0); 142ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 143ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1442ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek 145ab1889321f6f8f200f2b318ac26883ac18e49d03Ted KremenekCXCompletionString 146ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkCompletionString(CXCompletionString completion_string, 147ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 148218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 149ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 150ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 151ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 152ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 153ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 154ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 155ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 156ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 157ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 158ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 159ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 160ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 161ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 162ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 163ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 164ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 165ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 166ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 167ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 16801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 16901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 17001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 17101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 17201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 173ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 174ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 175ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 176ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 177ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return (*CCStr)[chunk_number].Optional; 178ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 179ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 180ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 181ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 182ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 183ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 184ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekunsigned clang_getNumCompletionChunks(CXCompletionString completion_string) { 185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 186ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CCStr? CCStr->size() : 0; 187ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 188ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 18912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorunsigned clang_getCompletionPriority(CXCompletionString completion_string) { 190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 191a2ace58cf99f9279a7467d987c6094145dd19d8bBill Wendling return CCStr? CCStr->getPriority() : unsigned(CCP_Unlikely); 19212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 19312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 19458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorenum CXAvailabilityKind 19558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorclang_getCompletionAvailability(CXCompletionString completion_string) { 196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return CCStr? static_cast<CXAvailabilityKind>(CCStr->getAvailability()) 198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : CXAvailability_Available; 19958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor} 20058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 201ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 202ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 203ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2040a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor AllocatedCXCodeCompleteResults(); 2050a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2060a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 207a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 208a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor llvm::SmallVector<StoredDiagnostic, 8> Diagnostics; 209a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 210f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 2111abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diag; 212f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 213a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 21435b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 215389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 216389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 217389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 21839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner /// \brief File manager, used for diagnostics. 21939b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner FileManager FileMgr; 22039b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 221389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 222389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis SourceManager SourceMgr; 223313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 224313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 225313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 226313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 227b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 2287ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// \brief Temporary buffers that will be deleted once we have finished with 2297ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// the code-completion results. 230b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor llvm::SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 231218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 232218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Allocator used to store code completion results. 233218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor llvm::BumpPtrAllocator CodeCompletionAllocator; 234ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 235ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 236e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// \brief Tracks the number of code-completion result objects that are 237e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// currently active. 238e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// 239e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// Used for debugging purposes only. 2401fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregorstatic llvm::sys::cas_flag CodeCompletionResultObjects; 241e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 2420a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults() 24333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : CXCodeCompleteResults(), 24433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(new Diagnostic( 24533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs))), 2467ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner FileMgr(FileSystemOpts), 24739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SourceMgr(*Diag, FileMgr) { 248e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2491fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicIncrement(&CodeCompletionResultObjects); 250e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "+++ %d completion results\n", CodeCompletionResultObjects); 251e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 252e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor} 2530a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2540a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 2550a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 256313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 257313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 258313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 259b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 260b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 261e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 262e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2631fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicDecrement(&CodeCompletionResultObjects); 264e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "--- %d completion results\n", CodeCompletionResultObjects); 265e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 2660a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 2670a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 2691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 2701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 2711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 2721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 27332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor llvm::SmallVector<CXCompletionResult, 16> StoredResults; 2741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 275218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CaptureCompletionResults(AllocatedCXCodeCompleteResults &Results) 2768071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor : CodeCompleteConsumer(true, false, true, false), 2778071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor AllocatedResults(Results) { } 27832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor ~CaptureCompletionResults() { Finish(); } 27932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 280e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 281e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 2820a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 28432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumResults); 2851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(S, 288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 28932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 29032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 29132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 29232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 29332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 2941abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 2951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 2961e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 29732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 29832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 29932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 30032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 30132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 302218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 303218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, S, 304218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 30532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 30632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 30732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 30832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 30932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 31032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 31132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 31232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 313218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor virtual llvm::BumpPtrAllocator &getAllocator() { 314218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return AllocatedResults.CodeCompletionAllocator; 315218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 316218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 31732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 31832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 31932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 32032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 32132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 32232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 32332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 32432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 3251abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 3261abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 3271abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3281abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 329b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 330b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 331b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 332b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 333b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 334b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 335b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 336b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 337b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 338b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 339b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 340b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 341b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 342b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 343b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 344b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 345b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 346b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 347b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 348b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 349b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 3501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 3511abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 3521abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 3531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 3541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 3551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 3571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 358a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek ASTUnit *AST = static_cast<ASTUnit *>(TU->TUData); 3591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 360b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 3611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 362593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 363593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 3641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 3651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 3661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 3671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 3681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 3691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 3701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 3711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 3721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 3751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 3761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 3791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults *Results = new AllocatedCXCodeCompleteResults; 3801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 3811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 3821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 3841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CaptureCompletionResults Capture(*Results); 3851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 3871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 388cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 389cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 390cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 391cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 3921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor *Results->Diag, Results->LangOpts, Results->SourceMgr, 3932283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->FileMgr, Results->Diagnostics, 3942283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 3951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 397ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 398da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 399da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 400da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 401da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<256> LogResult; 402da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 403da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 404da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 405da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 406da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 407da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 408da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 409da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 410da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 411da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 412da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 413da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 414da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 415da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 416da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 417da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 418da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 419da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 420da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 421da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<512> pchName; 422da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 423da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 424da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 425da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 426da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 427da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 428da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (stat(pchName.data(), &stat_results) == 0) 429da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 430da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 431da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 432da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 433da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 434da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 4352ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 4362ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 4372ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 4382ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 4392ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 4402ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 441da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 4422ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 4432ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 4442ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 445da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 446da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::StringRef res = os.str(); 447da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 448da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 449da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 450da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 451da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 452da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 453da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 454da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 455da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 456da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 457da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 458da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 459da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 460da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 461da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 462da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 463da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 464da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 465da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 466da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 467da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 468da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 469da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 470b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 471b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 472b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 473b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 474b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 475b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 476b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 477b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 478b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 479b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 480b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 481b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 482b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 483b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 484bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 485b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 486a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true); 487b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 488b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar } 489b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 490b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 491ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 492ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 493cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 494cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 495cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 496cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 497ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 498ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 499ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 500ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 501ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 502ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 503ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 504ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 50558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 506a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 507a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 508a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 509a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 510a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 511a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 512a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 513a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 514a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 515a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 516a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 517a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 518a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 519a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 520a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 521a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 522a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 523a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 524a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 525a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 526a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 527a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 528ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 5291e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 530c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 531c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 532c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 533c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 534c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 535c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 536c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 537c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 538c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 539c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 540c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 541c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregorstatic void AppendToString(llvm::StringRef &Old, llvm::StringRef New, 542c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 543c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 544c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 545c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 546c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 547c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 548c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 549c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 550c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 551c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 552c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 553c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 554c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 555c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 556c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 557c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 558c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 559c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 560c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 561c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregorstatic llvm::StringRef GetTypedName(CodeCompletionString *String, 562c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 563c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef Result; 564c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 565c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 566c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 567c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 568c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 569c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 570c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 571c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 572c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 5731e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 5741e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 5751e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 5761e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *X 578218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)XR.CompletionString; 579218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Y 580218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)YR.CompletionString; 5811e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 582c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> XBuffer; 583c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef XText = GetTypedName(X, XBuffer); 584c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> YBuffer; 585c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef YText = GetTypedName(Y, YBuffer); 5861e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 587c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 588c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 589c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 590c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 5911e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 5921e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 5931e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 5941e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 5951e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 596c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 5971aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 5981e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 5991e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 6001e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 6011e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 6021e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 6031e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 6041e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 6051e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 6061e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 607458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 608