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