CIndexCodeCompletion.cpp revision c93dc7889644293e318e19d82830ea2acc45b678
1ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===- CIndexCodeCompletion.cpp - Code Completion API hooks ---------------===// 2ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 3ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// The LLVM Compiler Infrastructure 4ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 5ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file is distributed under the University of Illinois Open Source 6ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// License. See LICENSE.TXT for details. 7ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 8ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===// 9ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 10ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file implements the Clang-C Source Indexing library hooks for 11ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// code completion. 12ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// 13ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===// 14ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 15ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "CIndexer.h" 160a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek#include "CXTranslationUnit.h" 17ed122735639d83c10f18c28c7fd117bfcd0f62cbTed Kremenek#include "CXString.h" 18e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "CXCursor.h" 19baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek#include "CXString.h" 20936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "CIndexDiagnostic.h" 21e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Type.h" 22e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/Decl.h" 23e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor#include "clang/AST/DeclObjC.h" 24b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/SourceManager.h" 25b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Basic/FileManager.h" 261abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#include "clang/Frontend/ASTUnit.h" 27b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer#include "clang/Frontend/CompilerInstance.h" 28936ea3b590117d2cd73b1b92621d06c4a7edbe60Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 29ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang/Sema/CodeCompleteConsumer.h" 30df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/ADT/SmallString.h" 31ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/ADT/StringExtras.h" 321fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor#include "llvm/Support/Atomic.h" 33b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar#include "llvm/Support/CrashRecoveryContext.h" 34ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 35df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/Timer.h" 36df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 3703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 383d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdlib> 393d398aa5c2be8919bbc0144bce611c48119bc861Douglas Gregor#include <cstdio> 40ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 41df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 42da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 43da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include "clang/Basic/Version.h" 44da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <arpa/inet.h> 45da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/socket.h> 46da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <sys/types.h> 47da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#include <unistd.h> 48da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 49da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 50ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekusing namespace clang; 512ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenekusing namespace clang::cxstring; 52ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 53ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekextern "C" { 54ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 55ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekenum CXCompletionChunkKind 56ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkKind(CXCompletionString completion_string, 57ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 58218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 59ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 61ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 62ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 63ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_TypedText; 65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Text; 67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 68ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Optional; 69ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 70ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Placeholder; 71ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 72ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Informative; 73ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 74ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_ResultType; 75ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 76ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_CurrentParameter; 77ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 78ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftParen; 79ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 80ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightParen; 81ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 82ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBracket; 83ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 84ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBracket; 85ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 86ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftBrace; 87ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 88ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightBrace; 89ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 90ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_LeftAngle; 91ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 92ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_RightAngle; 93ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 94ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CXCompletionChunk_Comma; 9501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 9601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Colon; 9701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 9801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_SemiColon; 9901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 10001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_Equal; 10101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 10201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_HorizontalSpace; 10301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 10401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return CXCompletionChunk_VerticalSpace; 105ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 106ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1077530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CompletionKind!"); 108ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 109ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1102ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed KremenekCXString clang_getCompletionChunkText(CXCompletionString completion_string, 1112ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek unsigned chunk_number) { 112218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 113ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 114a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek return createCXString((const char*)0); 115ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 116ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 117ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 119ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 120ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 121ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 122ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 123ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 124ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 125ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 126ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 127ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 128ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 129ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 130ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 131ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 13201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 13621c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor case CodeCompletionString::CK_VerticalSpace: 1375a9c0bca4504eeda45a3fd0ae1c244b2994f38b2Douglas Gregor return createCXString((*CCStr)[chunk_number].Text, false); 13821c241ff68c18ad87e1f18a579c535385aec7af1Douglas Gregor 139ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 140ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 1412ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek return createCXString(""); 142ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 143ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1443026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid CodeCompletionString Kind!"); 145ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 146ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1472ef6f8f5a35a60870594c5b04e0aa2bf22c6886fTed Kremenek 148ab1889321f6f8f200f2b318ac26883ac18e49d03Ted KremenekCXCompletionString 149ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekclang_getCompletionChunkCompletionString(CXCompletionString completion_string, 150ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek unsigned chunk_number) { 151218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 152ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!CCStr || chunk_number >= CCStr->size()) 153ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 154ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 155ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek switch ((*CCStr)[chunk_number].Kind) { 156ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_TypedText: 157ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Text: 158ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Placeholder: 159ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_CurrentParameter: 160ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Informative: 161ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftParen: 162ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightParen: 163ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBracket: 164ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBracket: 165ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftBrace: 166ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightBrace: 167ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_LeftAngle: 168ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_RightAngle: 169ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Comma: 170ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_ResultType: 17101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Colon: 17201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_SemiColon: 17301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_Equal: 17401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_HorizontalSpace: 17501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CodeCompletionString::CK_VerticalSpace: 176ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return 0; 177ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 178ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek case CodeCompletionString::CK_Optional: 179ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek // Note: treated as an empty text block. 180ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return (*CCStr)[chunk_number].Optional; 181ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek } 182ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 1837530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CompletionKind!"); 184ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 185ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 186ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekunsigned clang_getNumCompletionChunks(CXCompletionString completion_string) { 187218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 188ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return CCStr? CCStr->size() : 0; 189ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 190ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 19112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorunsigned clang_getCompletionPriority(CXCompletionString completion_string) { 192218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 193a2ace58cf99f9279a7467d987c6094145dd19d8bBill Wendling return CCStr? CCStr->getPriority() : unsigned(CCP_Unlikely); 19412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 19512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 19658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorenum CXAvailabilityKind 19758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregorclang_getCompletionAvailability(CXCompletionString completion_string) { 198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return CCStr? static_cast<CXAvailabilityKind>(CCStr->getAvailability()) 200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : CXAvailability_Available; 20158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor} 20258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 2036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned clang_getCompletionNumAnnotations(CXCompletionString completion_string) 2046164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen{ 2056164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 2066164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return CCStr ? CCStr->getAnnotationCount() : 0; 2076164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik VerbruggenCXString clang_getCompletionAnnotation(CXCompletionString completion_string, 2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen unsigned annotation_number) { 2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen CodeCompletionString *CCStr = (CodeCompletionString *)completion_string; 2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen return CCStr ? createCXString(CCStr->getAnnotation(annotation_number)) 2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen : createCXString((const char *) 0); 2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen} 2156164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 2166164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 217ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// \brief The CXCodeCompleteResults structure we allocate internally; 218ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek/// the client only sees the initial CXCodeCompleteResults structure. 219ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekstruct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults { 2200d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults(const FileSystemOptions& FileSystemOpts); 2210a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor ~AllocatedCXCodeCompleteResults(); 2220a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 223a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Diagnostics produced while performing code completion. 2245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StoredDiagnostic, 8> Diagnostics; 225a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 226f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor /// \brief Diag object 227c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> Diag; 228f715ca12bfc9fddfde75f98a197424434428b821Douglas Gregor 229a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor /// \brief Language options used to adjust source locations. 23035b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbar LangOptions LangOpts; 231389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 232389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileSystemOptions FileSystemOpts; 233389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 23439b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner /// \brief File manager, used for diagnostics. 235c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<FileManager> FileMgr; 23639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 237389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis /// \brief Source manager, used for diagnostics. 238c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<SourceManager> SourceMgr; 239313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 240313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// \brief Temporary files that should be removed once we have finished 241313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor /// with the code-completion results. 242313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor std::vector<llvm::sys::Path> TemporaryFiles; 243b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor 2447ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// \brief Temporary buffers that will be deleted once we have finished with 2457ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner /// the code-completion results. 2465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers; 247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 24848601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor /// \brief Allocator used to store globally cached code-completion results. 249c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<clang::GlobalCodeCompletionAllocator> 25048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor CachedCompletionAllocator; 25148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Allocator used to store code completion results. 253110a68e38bb37526f9bd1d4e8f1b941fe5410b27Douglas Gregor clang::CodeCompletionAllocator CodeCompletionAllocator; 2543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief Context under which completion occurred. 2563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum clang::CodeCompletionContext::Kind ContextKind; 2573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 2583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// \brief A bitfield representing the acceptable completions for the 2593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor /// current context. 2603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long Contexts; 261e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 2620a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The kind of the container for the current context for completions. 263e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CXCursorKind ContainerKind; 2640a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief The USR of the container for the current context for completions. 265e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString ContainerUSR; 2660a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief a boolean value indicating whether there is complete information 2670a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// about the container 268e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned ContainerIsIncomplete; 2690a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 2700a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// \brief A string containing the Objective-C selector entered thus far for a 2710a47d69af8bda945352997af3da4687a3356096aDouglas Gregor /// message send. 2720a47d69af8bda945352997af3da4687a3356096aDouglas Gregor std::string Selector; 273ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek}; 274ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 275e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// \brief Tracks the number of code-completion result objects that are 276e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// currently active. 277e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// 278e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor/// Used for debugging purposes only. 2791fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregorstatic llvm::sys::cas_flag CodeCompletionResultObjects; 280e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 2810d8d7e6067f9093e7d5abc45c9639ab977aab692Anders CarlssonAllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults( 2820d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson const FileSystemOptions& FileSystemOpts) 28333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : CXCodeCompleteResults(), 284d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie Diag(new DiagnosticsEngine( 285c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs))), 2860d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson FileSystemOpts(FileSystemOpts), 2874f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr(new FileManager(FileSystemOpts)), 288b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor SourceMgr(new SourceManager(*Diag, *FileMgr)), 289b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor Contexts(CXCompletionContext_Unknown), 290b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerKind(CXCursor_InvalidCode), 291b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerUSR(createCXString("")), 292b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor ContainerIsIncomplete(1) 293b77d197a78b30030e34bc14c27d63afc757c7d3bDouglas Gregor{ 294e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 2951fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicIncrement(&CodeCompletionResultObjects); 296e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "+++ %d completion results\n", CodeCompletionResultObjects); 297e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 298e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor} 2990a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3000a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas GregorAllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() { 3010a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor delete [] Results; 302313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor 303e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor clang_disposeString(ContainerUSR); 304e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 305313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 306313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 307b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I) 308b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor delete TemporaryBuffers[I]; 309e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor 310e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor if (getenv("LIBCLANG_OBJTRACKING")) { 3111fd9e0def66fbd50e99be5ff87c9fd1c91c428abDouglas Gregor llvm::sys::AtomicDecrement(&CodeCompletionResultObjects); 312e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor fprintf(stderr, "--- %d completion results\n", CodeCompletionResultObjects); 313e3c60a7ce9e0f42c7ca2344b33203266aceca1dbDouglas Gregor } 3140a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor} 3150a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 3161abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} // end extern "C" 3171abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorstatic unsigned long long getContextsForContextKind( 3193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind, 3203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor Sema &S) { 3213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor unsigned long long contexts = 0; 3223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor switch (kind) { 3233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_OtherWithMacros: { 3243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We can allow macros here, but we don't know what else is permissible 3253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //So we'll say the only thing permissible are macros 3263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 3273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TopLevel: 3303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCIvarList: 3313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassStructUnion: 3323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Type: { 3333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Statement: { 3453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 3463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 3483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 3503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Expression: { 3583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyValue; 3593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_AnyType | 3613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 3623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: { 3713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCObjectValue | 3723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCSelectorValue | 3733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface; 3743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 3753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_CXXClassTypeValue | 3763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyType | 3773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_EnumTag | 3783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 3793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 3803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 3813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 3823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_DotMemberAccess: { 3863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_DotMemberAccess; 3873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ArrowMemberAccess: { 3903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ArrowMemberAccess; 3913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCPropertyAccess: { 3943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCPropertyAccess; 3953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 3963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 3973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_EnumTag: { 3983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_EnumTag | 3993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_UnionTag: { 4033da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_UnionTag | 4043da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4063da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ClassOrStructTag: { 4083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_StructTag | 4093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCProtocolName: { 4143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCProtocol; 4153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Namespace: { 4183da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Namespace; 4193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PotentiallyQualifiedName: { 4223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NestedNameSpecifier; 4233da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroNameUse: { 4263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_MacroName; 4273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_NaturalLanguage: { 4303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_NaturalLanguage; 4313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_SelectorName: { 4343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCSelectorName; 4353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4373da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: { 4383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_AnyType | 4393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ObjCInterface | 4403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_AnyValue; 4413da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (S.getLangOptions().CPlusPlus) { 4423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts |= CXCompletionContext_EnumTag | 4433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_UnionTag | 4443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_StructTag | 4453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_ClassTag | 4463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CXCompletionContext_NestedNameSpecifier; 4473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInstanceMessage: { 4513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInstanceMessage; 4523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCClassMessage: { 4553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCClassMessage; 4563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4573da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4580f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor case CodeCompletionContext::CCC_ObjCInterfaceName: { 4593da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCInterface; 4603da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4613da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCCategoryName: { 4633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_ObjCCategory; 4643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Other: 4673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCInterface: 4683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_ObjCImplementation: 4693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Name: 4703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_MacroName: 4713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorExpression: 4723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_PreprocessorDirective: 4733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_TypeQualifiers: { 4743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //Only Clang results should be accepted, so we'll set all of the other 4753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //context bits to 0 (i.e. the empty set) 4763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unexposed; 4773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor case CodeCompletionContext::CCC_Recovery: { 4803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We don't know what the current context is, so we'll return unknown 4813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //This is the equivalent of setting all of the other context bits 4823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contexts = CXCompletionContext_Unknown; 4833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor break; 4843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 4863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return contexts; 4873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 4883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 4891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregornamespace { 4901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor class CaptureCompletionResults : public CodeCompleteConsumer { 4911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AllocatedCXCodeCompleteResults &AllocatedResults; 4925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXCompletionResult, 16> StoredResults; 493e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TU; 4941abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor public: 495e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults(AllocatedCXCodeCompleteResults &Results, 496e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXTranslationUnit *TranslationUnit) 4978071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor : CodeCompleteConsumer(true, false, true, false), 498e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults(Results), TU(TranslationUnit) { } 49932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor ~CaptureCompletionResults() { Finish(); } 50032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 501e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 502e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 5030a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 5041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 50532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumResults); 5061abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 507218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Results[I].CreateCodeCompletionString(S, 509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 51032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 51132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 51232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = Results[I].CursorKind; 51332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 51432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 5151abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 517e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor enum CodeCompletionContext::Kind contextKind = Context.getKind(); 518e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 519e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContextKind = contextKind; 520e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.Contexts = getContextsForContextKind(contextKind, S); 521e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5220a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector = ""; 5230a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (Context.getNumSelIdents() > 0) { 5240a47d69af8bda945352997af3da4687a3356096aDouglas Gregor for (unsigned i = 0; i < Context.getNumSelIdents(); i++) { 5250a47d69af8bda945352997af3da4687a3356096aDouglas Gregor IdentifierInfo *selIdent = Context.getSelIdents()[i]; 5260a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (selIdent != NULL) { 5270a47d69af8bda945352997af3da4687a3356096aDouglas Gregor StringRef selectorString = Context.getSelIdents()[i]->getName(); 528a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer AllocatedResults.Selector += selectorString; 5290a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5300a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedResults.Selector += ":"; 5310a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5320a47d69af8bda945352997af3da4687a3356096aDouglas Gregor } 5330a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 534e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType baseType = Context.getBaseType(); 535e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NamedDecl *D = NULL; 536e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 537e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!baseType.isNull()) { 538e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the declaration for a class/struct/union/enum type 539e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (const TagType *Tag = baseType->getAs<TagType>()) 540e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Tag->getDecl(); 541e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for a (possibly-qualified) Objective-C 542e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // object pointer type, e.g., NSString* 543e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectPointerType *ObjPtr = 544e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<ObjCObjectPointerType>()) 545e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = ObjPtr->getInterfaceDecl(); 546e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the @interface declaration for an Objective-C object type 547e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const ObjCObjectType *Obj = baseType->getAs<ObjCObjectType>()) 548e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Obj->getInterface(); 549e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor // Get the class for a C++ injected-class-name 550e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else if (const InjectedClassNameType *Injected = 551e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor baseType->getAs<InjectedClassNameType>()) 552e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor D = Injected->getDecl(); 553e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 555e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (D != NULL) { 556e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursor cursor = cxcursor::MakeCXCursor(D, *TU); 557e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 558e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCursorKind cursorKind = clang_getCursorKind(cursor); 559e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXString cursorUSR = clang_getCursorUSR(cursor); 560e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 561baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // Normally, clients of CXString shouldn't care whether or not 562baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // a CXString is managed by a pool or by explicitly malloc'ed memory. 563baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // However, there are cases when AllocatedResults outlives the 564baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek // CXTranslationUnit. This is a workaround that failure mode. 565baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek if (cxstring::isManagedByPool(cursorUSR)) { 566baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek CXString heapStr = 567baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek cxstring::createCXString(clang_getCString(cursorUSR), true); 568baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek clang_disposeString(cursorUSR); 569baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek cursorUSR = heapStr; 570baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek } 571baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek 572e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = cursorKind; 573e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = cursorUSR; 574baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek 575e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor const Type *type = baseType.getTypePtrOrNull(); 576e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (type != NULL) { 577e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = type->isIncompleteType(); 578e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 579e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 580e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 581e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 582e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 583e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor else { 584e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerKind = CXCursor_InvalidCode; 585e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerUSR = createCXString(""); 586e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedResults.ContainerIsIncomplete = 1; 587e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 5881abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5891e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 59032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 59132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor OverloadCandidate *Candidates, 59232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor unsigned NumCandidates) { 59332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.reserve(StoredResults.size() + NumCandidates); 59432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 595218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *StoredCompletion 596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, S, 597218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllocatedResults.CodeCompletionAllocator); 59832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 59932be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor CXCompletionResult R; 60032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CursorKind = CXCursor_NotImplemented; 60132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor R.CompletionString = StoredCompletion; 60232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.push_back(R); 60332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 60432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 60532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor 606dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor virtual CodeCompletionAllocator &getAllocator() { 607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return AllocatedResults.CodeCompletionAllocator; 608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 61032be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor private: 61132be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor void Finish() { 61232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.Results = new CXCompletionResult [StoredResults.size()]; 61332be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor AllocatedResults.NumResults = StoredResults.size(); 61432be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor std::memcpy(AllocatedResults.Results, StoredResults.data(), 61532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.size() * sizeof(CXCompletionResult)); 61632be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor StoredResults.clear(); 61732be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor } 6181abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor }; 6191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 6201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorextern "C" { 622b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarstruct CodeCompleteAtInfo { 623b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU; 624b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename; 625b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line; 626b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column; 627b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files; 628b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files; 629b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options; 630b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXCodeCompleteResults *result; 631b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar}; 632b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbarvoid clang_codeCompleteAt_Impl(void *UserData) { 633b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); 634b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CXTranslationUnit TU = CCAI->TU; 635b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename = CCAI->complete_filename; 636b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line = CCAI->complete_line; 637b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column = CCAI->complete_column; 638b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files = CCAI->unsaved_files; 639b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files = CCAI->num_unsaved_files; 640b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options = CCAI->options; 641b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = 0; 642b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 6431abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER 6441abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 6451abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::TimeRecord &StartTime = llvm::TimeRecord::getCurrentTime(); 6461abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6471abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor#endif 6481abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6491abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; 6501abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 651a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek ASTUnit *AST = static_cast<ASTUnit *>(TU->TUData); 6521abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!AST) 653b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return; 6541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 655593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor ASTUnit::ConcurrencyCheck Check(*AST); 656593b0c1047f1323ebbda78ae38e96f976241c663Douglas Gregor 6571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform the remapping of source files. 6585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 6591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != num_unsaved_files; ++I) { 6605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 6611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const llvm::MemoryBuffer *Buffer 6621abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 6631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 6641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Buffer)); 6651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableLogging) { 6681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: Add logging. 6691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 6701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Parse the resulting source file to find code-completion results. 6720d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson AllocatedCXCodeCompleteResults *Results = 6730d8d7e6067f9093e7d5abc45c9639ab977aab692Anders Carlsson new AllocatedCXCodeCompleteResults(AST->getFileSystemOpts()); 6741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->Results = 0; 6751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Results->NumResults = 0; 67648601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 6771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create a code-completion consumer to capture the results. 678e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CaptureCompletionResults Capture(*Results, &TU); 6791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Perform completion. 6811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor AST->CodeComplete(complete_filename, complete_line, complete_column, 682cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor RemappedFiles.data(), RemappedFiles.size(), 683cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeMacros), 684cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor (options & CXCodeComplete_IncludeCodePatterns), 685cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor Capture, 6864f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->Diag, Results->LangOpts, *Results->SourceMgr, 6874f32786ac45210143654390177105eb749b614e9Ted Kremenek *Results->FileMgr, Results->Diagnostics, 6882283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor Results->TemporaryBuffers); 68948601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor 69048601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // Keep a reference to the allocator used for cached global completions, so 69148601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // that we can be sure that the memory used by our code completion strings 69248601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // doesn't get freed due to subsequent reparses (while the code completion 69348601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor // results are still active). 69448601b32321496b07a18fb6631f8563275d8c5fbDouglas Gregor Results->CachedCompletionAllocator = AST->getCachedCompletionAllocator(); 6951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 6961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 697ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 698da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER 699da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#ifdef UDP_CODE_COMPLETION_LOGGER_PORT 700da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const llvm::TimeRecord &EndTime = llvm::TimeRecord::getCurrentTime(); 70136d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> LogResult; 702da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(LogResult); 703da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 704da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Figure out the language and whether or not it uses PCH. 705da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *lang = 0; 706da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bool usesPCH = false; 707da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 708da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek for (std::vector<const char*>::iterator I = argv.begin(), E = argv.end(); 709da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek I != E; ++I) { 710da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (*I == 0) 711da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 712da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (strcmp(*I, "-x") == 0) { 713da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I + 1 != E) { 714da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek lang = *(++I); 715da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 716da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 717da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 718da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek else if (strcmp(*I, "-include") == 0) { 719da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (I+1 != E) { 720da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *arg = *(++I); 72136d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<512> pchName; 722da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek { 723da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek llvm::raw_svector_ostream os(pchName); 724da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek os << arg << ".pth"; 725da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 726da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek pchName.push_back('\0'); 727da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct stat stat_results; 7280a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (stat(pchName.str().c_str(), &stat_results) == 0) 729da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek usesPCH = true; 730da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek continue; 731da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 732da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 733da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 734da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7352ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "{ "; 7362ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << "\"wall\": " << (EndTime.getWallTime() - StartTime.getWallTime()); 7372ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"numRes\": " << Results->NumResults; 7382ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"diags\": " << Results->Diagnostics.size(); 7392ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"pch\": " << (usesPCH ? "true" : "false"); 7402ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"lang\": \"" << (lang ? lang : "<unknown>") << '"'; 741da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek const char *name = getlogin(); 7422ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"user\": \"" << (name ? name : "unknown") << '"'; 7432ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << ", \"clangVer\": \"" << getClangFullVersion() << '"'; 7442ee297fab4a818f0d94d74d6c0701c9c5184235dTed Kremenek os << " }"; 745da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 7465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef res = os.str(); 747da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (res.size() > 0) { 748da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek do { 749da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek // Setup the UDP socket. 750da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek struct sockaddr_in servaddr; 751da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek bzero(&servaddr, sizeof(servaddr)); 752da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_family = AF_INET; 753da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek servaddr.sin_port = htons(UDP_CODE_COMPLETION_LOGGER_PORT); 754da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (inet_pton(AF_INET, UDP_CODE_COMPLETION_LOGGER, 755da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek &servaddr.sin_addr) <= 0) 756da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 757da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 758da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 759da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek if (sockfd < 0) 760da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek break; 761da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek 762da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek sendto(sockfd, res.data(), res.size(), 0, 763da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek (struct sockaddr *)&servaddr, sizeof(servaddr)); 764da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek close(sockfd); 765da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 766da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek while (false); 767da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek } 768da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 769da7af32f4e4b43b763019e7a522f4bfd5c060d09Ted Kremenek#endif 770b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CCAI->result = Results; 771b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar} 772b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel DunbarCXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, 773b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar const char *complete_filename, 774b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_line, 775b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned complete_column, 776b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar struct CXUnsavedFile *unsaved_files, 777b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned num_unsaved_files, 778b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar unsigned options) { 779b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line, 780b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar complete_column, unsaved_files, num_unsaved_files, 781b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar options, 0 }; 782b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar llvm::CrashRecoveryContext CRC; 783b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 784bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { 785b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar fprintf(stderr, "libclang: crash detected in code completion\n"); 786a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true); 787b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return 0; 7886df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 7896df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor PrintLibclangResourceUsage(TU); 790b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar 791b1fd3458680bc9c8988dee8967e9c0709fef3945Daniel Dunbar return CCAI.result; 792ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 793ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 794cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregorunsigned clang_defaultCodeCompleteOptions(void) { 795cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor return CXCodeComplete_IncludeMacros; 796cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor} 797cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 798ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekvoid clang_disposeCodeCompleteResults(CXCodeCompleteResults *ResultsIn) { 799ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek if (!ResultsIn) 800ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek return; 801ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek 802ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek AllocatedCXCodeCompleteResults *Results 803ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 804ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek delete Results; 805ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} 80658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 807a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorunsigned 808a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetNumDiagnostics(CXCodeCompleteResults *ResultsIn) { 809a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 810a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 811a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results) 812a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 813a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 814a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return Results->Diagnostics.size(); 815a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 816a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 817a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas GregorCXDiagnostic 818a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclang_codeCompleteGetDiagnostic(CXCodeCompleteResults *ResultsIn, 819a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned Index) { 820a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor AllocatedCXCodeCompleteResults *Results 821a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 822a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor if (!Results || Index >= Results->Diagnostics.size()) 823a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return 0; 824a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 825a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return new CXStoredDiagnostic(Results->Diagnostics[Index], Results->LangOpts); 826a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 827a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 8283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorunsigned long long 8293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregorclang_codeCompleteGetContexts(CXCodeCompleteResults *ResultsIn) { 8303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor AllocatedCXCodeCompleteResults *Results 8313da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor = static_cast<AllocatedCXCodeCompleteResults*>(ResultsIn); 8323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (!Results) 8333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return 0; 8343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 8353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor return Results->Contexts; 8363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor} 837a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 838e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregorenum CXCursorKind clang_codeCompleteGetContainerKind( 839e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CXCodeCompleteResults *ResultsIn, 840e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor unsigned *IsIncomplete) { 841e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 842e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 843e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 844e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return CXCursor_InvalidCode; 845e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 846e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (IsIncomplete != NULL) { 847e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor *IsIncomplete = Results->ContainerIsIncomplete; 848e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor } 849e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 850e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return Results->ContainerKind; 851e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 852e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 853e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas GregorCXString clang_codeCompleteGetContainerUSR(CXCodeCompleteResults *ResultsIn) { 854e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor AllocatedCXCodeCompleteResults *Results = 855e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 856e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor if (!Results) 857e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(""); 858e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 859e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor return createCXString(clang_getCString(Results->ContainerUSR)); 860e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor} 8610a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8620a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8630a47d69af8bda945352997af3da4687a3356096aDouglas GregorCXString clang_codeCompleteGetObjCSelector(CXCodeCompleteResults *ResultsIn) { 8640a47d69af8bda945352997af3da4687a3356096aDouglas Gregor AllocatedCXCodeCompleteResults *Results = 8650a47d69af8bda945352997af3da4687a3356096aDouglas Gregor static_cast<AllocatedCXCodeCompleteResults *>(ResultsIn); 8660a47d69af8bda945352997af3da4687a3356096aDouglas Gregor if (!Results) 8670a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(""); 8680a47d69af8bda945352997af3da4687a3356096aDouglas Gregor 8690a47d69af8bda945352997af3da4687a3356096aDouglas Gregor return createCXString(Results->Selector); 8700a47d69af8bda945352997af3da4687a3356096aDouglas Gregor} 871e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 872ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek} // end extern "C" 8731e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 874c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Simple utility function that appends a \p New string to the given 875c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \p Old string, using the \p Buffer for storage. 876c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 877c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Old The string to which we are appending. This parameter will be 878c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// updated to reflect the complete string. 879c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 880c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 881c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param New The string to append to \p Old. 882c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 883c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer that stores the actual, concatenated string. It will 884c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// be used if the old string is already-non-empty. 8855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void AppendToString(StringRef &Old, StringRef New, 88636d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> &Buffer) { 887c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Old.empty()) { 888c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = New; 889c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return; 890c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 891c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 892c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (Buffer.empty()) 893c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(Old.begin(), Old.end()); 894c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Buffer.append(New.begin(), New.end()); 895c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor Old = Buffer.str(); 896c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 897c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 898c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \brief Get the typed-text blocks from the given code-completion string 899c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// and return them as a single string. 900c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 901c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param String The code-completion string whose typed-text blocks will be 902c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// concatenated. 903c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// 904c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor/// \param Buffer A buffer used for storage of the completed name. 9055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef GetTypedName(CodeCompletionString *String, 90636d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> &Buffer) { 9075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Result; 908c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor for (CodeCompletionString::iterator C = String->begin(), CEnd = String->end(); 909c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor C != CEnd; ++C) { 910c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (C->Kind == CodeCompletionString::CK_TypedText) 911c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor AppendToString(Result, C->Text, Buffer); 912c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor } 913c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 914c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return Result; 915c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor} 916c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 9171e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregornamespace { 9181e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor struct OrderCompletionResults { 9191e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor bool operator()(const CXCompletionResult &XR, 9201e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor const CXCompletionResult &YR) const { 921218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *X 922218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)XR.CompletionString; 923218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionString *Y 924218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = (CodeCompletionString *)YR.CompletionString; 9251e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 92636d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> XBuffer; 9275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef XText = GetTypedName(X, XBuffer); 92836d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith SmallString<256> YBuffer; 9295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef YText = GetTypedName(Y, YBuffer); 9301e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 931c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor if (XText.empty() || YText.empty()) 932c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor return !XText.empty(); 933c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 934c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor int result = XText.compare_lower(YText); 9351e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result < 0) 9361e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return true; 9371e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (result > 0) 9381e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return false; 9391e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 940c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor result = XText.compare(YText); 9411aad34043d261fe7fe3edefa8484faa548b0176aDouglas Gregor return result < 0; 9421e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 9431e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor }; 9441e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor} 9451e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 9461e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregorextern "C" { 9471e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor void clang_sortCodeCompletionResults(CXCompletionResult *Results, 9481e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor unsigned NumResults) { 9491e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults, OrderCompletionResults()); 9501e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor } 951458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 952