diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:49:41 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:49:41 +0000 | 
| commit | 45b533945f0851ec234ca846e1af5ee1e4df0b6e (patch) | |
| tree | 0a5b74c0b9ca73aded34df95c91fcaf3815230d8 /tools/libclang/CIndexCodeCompletion.cpp | |
| parent | 7e86edd64bfae4e324224452e4ea879b3371a4bd (diff) | |
Notes
Diffstat (limited to 'tools/libclang/CIndexCodeCompletion.cpp')
| -rw-r--r-- | tools/libclang/CIndexCodeCompletion.cpp | 50 | 
1 files changed, 21 insertions, 29 deletions
diff --git a/tools/libclang/CIndexCodeCompletion.cpp b/tools/libclang/CIndexCodeCompletion.cpp index 9609a693abdf..344ed27021a1 100644 --- a/tools/libclang/CIndexCodeCompletion.cpp +++ b/tools/libclang/CIndexCodeCompletion.cpp @@ -646,25 +646,12 @@ namespace {    };  } -extern "C" { -struct CodeCompleteAtInfo { -  CXTranslationUnit TU; -  const char *complete_filename; -  unsigned complete_line; -  unsigned complete_column; -  ArrayRef<CXUnsavedFile> unsaved_files; -  unsigned options; -  CXCodeCompleteResults *result; -}; -static void clang_codeCompleteAt_Impl(void *UserData) { -  CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); -  CXTranslationUnit TU = CCAI->TU; -  const char *complete_filename = CCAI->complete_filename; -  unsigned complete_line = CCAI->complete_line; -  unsigned complete_column = CCAI->complete_column; -  unsigned options = CCAI->options; +static CXCodeCompleteResults * +clang_codeCompleteAt_Impl(CXTranslationUnit TU, const char *complete_filename, +                          unsigned complete_line, unsigned complete_column, +                          ArrayRef<CXUnsavedFile> unsaved_files, +                          unsigned options) {    bool IncludeBriefComments = options & CXCodeComplete_IncludeBriefComments; -  CCAI->result = nullptr;  #ifdef UDP_CODE_COMPLETION_LOGGER  #ifdef UDP_CODE_COMPLETION_LOGGER_PORT @@ -676,12 +663,12 @@ static void clang_codeCompleteAt_Impl(void *UserData) {    if (cxtu::isNotUsableTU(TU)) {      LOG_BAD_TU(TU); -    return; +    return nullptr;    }    ASTUnit *AST = cxtu::getASTUnit(TU);    if (!AST) -    return; +    return nullptr;    CIndexer *CXXIdx = TU->CIdx;    if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) @@ -692,7 +679,7 @@ static void clang_codeCompleteAt_Impl(void *UserData) {    // Perform the remapping of source files.    SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; -  for (auto &UF : CCAI->unsaved_files) { +  for (auto &UF : unsaved_files) {      std::unique_ptr<llvm::MemoryBuffer> MB =          llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);      RemappedFiles.push_back(std::make_pair(UF.Filename, MB.release())); @@ -804,8 +791,10 @@ static void clang_codeCompleteAt_Impl(void *UserData) {    }  #endif  #endif -  CCAI->result = Results; +  return Results;  } + +extern "C" {  CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU,                                              const char *complete_filename,                                              unsigned complete_line, @@ -821,25 +810,28 @@ CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU,    if (num_unsaved_files && !unsaved_files)      return nullptr; -  CodeCompleteAtInfo CCAI = {TU, complete_filename, complete_line, -    complete_column, llvm::makeArrayRef(unsaved_files, num_unsaved_files), -    options, nullptr}; +  CXCodeCompleteResults *result; +  auto CodeCompleteAtImpl = [=, &result]() { +    result = clang_codeCompleteAt_Impl( +        TU, complete_filename, complete_line, complete_column, +        llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); +  };    if (getenv("LIBCLANG_NOTHREADS")) { -    clang_codeCompleteAt_Impl(&CCAI); -    return CCAI.result; +    CodeCompleteAtImpl(); +    return result;    }    llvm::CrashRecoveryContext CRC; -  if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { +  if (!RunSafely(CRC, CodeCompleteAtImpl)) {      fprintf(stderr, "libclang: crash detected in code completion\n");      cxtu::getASTUnit(TU)->setUnsafeToFree(true);      return nullptr;    } else if (getenv("LIBCLANG_RESOURCE_USAGE"))      PrintLibclangResourceUsage(TU); -  return CCAI.result; +  return result;  }  unsigned clang_defaultCodeCompleteOptions(void) {  | 
