CIndexCodeCompletion.cpp revision bf44c3b099602c9c967f1b20995919fb4ef39a51
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" 16936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "CIndexDiagnostic.h" 17b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/SourceManager.h" 18b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.h" 191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#include "clang/Frontend/ASTUnit.h" 20b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Frontend/CompilerInstance.h" 21936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 22ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang/Sema/CodeCompleteConsumer.h" 23df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/ADT/SmallString.h" 24ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/ADT/StringExtras.h" 25b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar#include "llvm/Support/CrashRecoveryContext.h" 26ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 27df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 28df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 29ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/System/Program.h" 303d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdlib> 313d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 32ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 33df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 34da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 35da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 36da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 37da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 38da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 39da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 40da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 41da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 42ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 432ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenekusing namespace clang::cxstring; 44ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 4512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregornamespace { 4612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor /// \brief Stored representation of a completion string. 4712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor /// 4812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor /// This is the representation behind a CXCompletionString. 4912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor class CXStoredCodeCompletionString : public CodeCompletionString { 5012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor unsigned Priority; 5158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CXAvailabilityKind Availability; 5212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 5312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor public: 5458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CXStoredCodeCompletionString(unsigned Priority, 5558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CXAvailabilityKind Availability) 5658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor : Priority(Priority), Availability(Availability) { } 5712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 5812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor unsigned getPriority() const { return Priority; } 5958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CXAvailabilityKind getAvailability() const { return Availability; } 6012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor }; 6112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 6212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 6812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor CXStoredCodeCompletionString *CCStr 6912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 90ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 91ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 92ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 93ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 94ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 95ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 96ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 97ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 98ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 99ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 100ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 101ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 102ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 103ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 104ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 105ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 10601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 10701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 10801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 10901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 11001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 11101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 11201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 11301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 11401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 11501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 116ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 117ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 119ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 120ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 121ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1222ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed KremenekCXString clang_getCompletionChunkText(CXCompletionString completion_string, 1232ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek unsigned chunk_number) { 12412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor CXStoredCodeCompletionString *CCStr 12512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 126ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 1272ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(0); 128ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 129ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 130ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 131ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 132ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 133ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 134ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 135ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 136ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 137ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 138ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 139ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 140ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 141ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 142ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 143ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 144ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 14921c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor case CodeCompletionString::CK_VerticalSpace: 1505a9c0bca4504eeda45a3fd0ae1c244b2994f38b2Douglas Gregor return createCXString((*CCStr)[chunk_number].Text, false); 15121c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor 152ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 153ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 1542ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(""); 155ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 156ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 157ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 1582ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(0); 159ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 160ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1612ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek 162ab1889321f6f8f200f2b318ac26883ac18e49d03Ted KremenekCXCompletionString 163ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkCompletionString(CXCompletionString completion_string, 164ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 16512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor CXStoredCodeCompletionString *CCStr 16612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 167ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 168ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 169ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 170ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 171ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 172ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 173ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 174ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 175ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 176ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 177ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 178ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 179ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 180ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 181ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 182ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 183ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 184ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 185ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 18601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 18701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 18801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 18901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 19001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 191ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 192ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 193ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 194ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 195ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return (*CCStr)[chunk_number].Optional; 196ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 197ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 198ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Should be unreachable, but let's be careful. 199ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 200ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 201ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 202ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekunsigned clang_getNumCompletionChunks(CXCompletionString completion_string) { 20312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor CXStoredCodeCompletionString *CCStr 20412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 205ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CCStr? CCStr->size() : 0; 206ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 207ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 20812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorunsigned clang_getCompletionPriority(CXCompletionString completion_string) { 20912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor CXStoredCodeCompletionString *CCStr 21012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 211a2ace58cf99f9279a7467d987c6094145dd19d8bBill Wendling return CCStr? CCStr->getPriority() : unsigned(CCP_Unlikely); 21212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 21312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 21458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorenum CXAvailabilityKind 21558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorclang_getCompletionAvailability(CXCompletionString completion_string) { 21658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CXStoredCodeCompletionString *CCStr 21758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor = (CXStoredCodeCompletionString *)completion_string; 21858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor return CCStr? CCStr->getAvailability() : CXAvailability_Available; 21958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor} 22058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 221ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 222ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 223ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2240a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor AllocatedCXCodeCompleteResults(); 2250a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2260a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 227a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 228a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor llvm::SmallVector<StoredDiagnostic, 8> Diagnostics; 229a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 230f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 2311abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diag; 232f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 233a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 23435b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 235a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 236a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief File manager, used for diagnostics. 237a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor FileManager FileMgr; 238389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 239389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 240389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 241389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 242389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis SourceManager SourceMgr; 243313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 244313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 245313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 246313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 247b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 248b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor /// \brief Temporary buffers that will be deleted once we have finished with the code-completion results. 249b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor llvm::SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 250ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 251ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 2520a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults() 253389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis : CXCodeCompleteResults(), Diag(new Diagnostic), 254389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis SourceMgr(*Diag, FileMgr, FileSystemOpts) { } 2550a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2560a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 2570a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor for (unsigned I = 0, N = NumResults; I != N; ++I) 25812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor delete (CXStoredCodeCompletionString *)Results[I].CompletionString; 2590a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 260313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 261313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 262313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 263b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 264b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 2650a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 2660a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 2681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 2691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 2701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 2711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 27232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor llvm::SmallVector<CXCompletionResult, 16> StoredResults; 27332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 2741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 2751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor explicit 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) { 2861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CXStoredCodeCompletionString *StoredCompletion 28758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor = new CXStoredCodeCompletionString(Results[I].Priority, 28858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Results[I].Availability); 2891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor (void)Results[I].CreateCodeCompletionString(S, StoredCompletion); 29032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 29132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 29232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 29332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 29432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 2951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 2961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 2971e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 29832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 29932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 30032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 30132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 30232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 30332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor // FIXME: Set priority, availability appropriately. 30432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXStoredCodeCompletionString *StoredCompletion 30532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor = new CXStoredCodeCompletionString(1, CXAvailability_Available); 30632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor (void)Candidates[I].CreateSignatureString(CurrentArg, S, 30732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredCompletion); 30832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 30932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 31032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 31132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 31232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 31332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 31432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 31532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 31632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 31732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 31832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 31932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 32032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 32132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 32232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 32332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 3241abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 3251abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 3261abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3271abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 328b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 329b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 330b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 331b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 332b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 333b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 334b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 335b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 336b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 337b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 338b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 339b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 340b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 341b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 342b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 343b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 344b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 345b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 346b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 347b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 348b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 3491abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 3501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 3511abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 3521abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 3531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 3541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 3561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor ASTUnit *AST = static_cast<ASTUnit *>(TU); 3581abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 359b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 3601abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 361593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 362593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 3631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 3641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 3651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 3661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 3671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 3681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 3691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 3701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 3711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 3741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 3751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 3781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults *Results = new AllocatedCXCodeCompleteResults; 3791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 3801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 3811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 3831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CaptureCompletionResults Capture(*Results); 3841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 3861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 387cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 388cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 389cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 390cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 3911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor *Results->Diag, Results->LangOpts, Results->SourceMgr, 3922283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->FileMgr, Results->Diagnostics, 3932283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 3941abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 396ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 397da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 398da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 399da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 400da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<256> LogResult; 401da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 402da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 403da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 404da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 405da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 406da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 407da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 408da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 409da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 410da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 411da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 412da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 413da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 414da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 415da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 416da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 417da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 418da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 419da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 420da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::SmallString<512> pchName; 421da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 422da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 423da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 424da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 425da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 426da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 427da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (stat(pchName.data(), &stat_results) == 0) 428da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 429da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 430da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 431da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 432da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 433da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 4342ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 4352ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 4362ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 4372ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 4382ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 4392ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 440da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 4412ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 4422ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 4432ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 444da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 445da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::StringRef res = os.str(); 446da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 447da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 448da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 449da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 450da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 451da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 452da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 453da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 454da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 455da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 456da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 457da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 458da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 459da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 460da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 461da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 462da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 463da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 464da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 465da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 466da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 467da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 468da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 469b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 470b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 471b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 472b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 473b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 474b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 475b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 476b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 477b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 478b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 479b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 480b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 481b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 482b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 483bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 484b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 485b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar static_cast<ASTUnit *>(TU)->setUnsafeToFree(true); 486b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 487b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar } 488b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 489b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 490ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 491ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 492cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 493cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 494cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 495cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 496ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 497ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 498ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 499ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 500ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 501ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 502ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 503ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 50458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 505a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 506a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 507a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 508a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 509a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 510a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 511a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 512a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 513a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 514a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 515a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 516a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 517a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 518a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 519a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 520a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 521a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 522a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 523a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 524a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 525a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 526a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 527ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 5281e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 529c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 530c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 531c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 532c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 533c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 534c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 535c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 536c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 537c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 538c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 539c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 540c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregorstatic void AppendToString(llvm::StringRef &Old, llvm::StringRef New, 541c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 542c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 543c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 544c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 545c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 546c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 547c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 548c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 549c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 550c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 551c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 552c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 553c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 554c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 555c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 556c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 557c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 558c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 559c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 560c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregorstatic llvm::StringRef GetTypedName(CodeCompletionString *String, 561c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> &Buffer) { 562c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef Result; 563c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 564c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 565c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 566c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 567c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 568c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 569c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 570c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 571c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 5721e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 5731e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 5741e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 5751e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 5761e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor CXStoredCodeCompletionString *X 5771e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor = (CXStoredCodeCompletionString *)XR.CompletionString; 5781e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor CXStoredCodeCompletionString *Y 5791e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor = (CXStoredCodeCompletionString *)YR.CompletionString; 5801e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 581c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> XBuffer; 582c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef XText = GetTypedName(X, XBuffer); 583c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::SmallString<256> YBuffer; 584c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor llvm::StringRef YText = GetTypedName(Y, YBuffer); 5851e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 586c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 587c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 588c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 589c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 5901e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 5911e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 5921e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 5931e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 5941e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 595c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 5961aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 5971e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 5981e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 5991e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 6001e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 6011e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 6021e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 6031e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 6041e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 6051e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 606458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 607