libclang: refactor handling of unsaved_files
Consolidate CXUnsavedFile argument handling in API functions to support a wider
cleanup of various file remapping schemes in the frontend.
llvm-svn: 212427
diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp
index e4f886b..05a18b7 100644
--- a/clang/tools/libclang/Indexing.cpp
+++ b/clang/tools/libclang/Indexing.cpp
@@ -472,28 +472,17 @@
const char *source_filename;
const char *const *command_line_args;
int num_command_line_args;
- struct CXUnsavedFile *unsaved_files;
- unsigned num_unsaved_files;
+ ArrayRef<CXUnsavedFile> unsaved_files;
CXTranslationUnit *out_TU;
unsigned TU_options;
- int result;
-};
-
-struct MemBufferOwner {
- SmallVector<const llvm::MemoryBuffer *, 8> Buffers;
-
- ~MemBufferOwner() {
- for (SmallVectorImpl<const llvm::MemoryBuffer *>::iterator
- I = Buffers.begin(), E = Buffers.end(); I != E; ++I)
- delete *I;
- }
+ mutable int result;
};
} // anonymous namespace
static void clang_indexSourceFile_Impl(void *UserData) {
- IndexSourceFileInfo *ITUI =
- static_cast<IndexSourceFileInfo*>(UserData);
+ const IndexSourceFileInfo *ITUI =
+ static_cast<IndexSourceFileInfo *>(UserData);
CXIndexAction cxIdxAction = ITUI->idxAction;
CXClientData client_data = ITUI->client_data;
IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks;
@@ -502,8 +491,6 @@
const char *source_filename = ITUI->source_filename;
const char * const *command_line_args = ITUI->command_line_args;
int num_command_line_args = ITUI->num_command_line_args;
- struct CXUnsavedFile *unsaved_files = ITUI->unsaved_files;
- unsigned num_unsaved_files = ITUI->num_unsaved_files;
CXTranslationUnit *out_TU = ITUI->out_TU;
unsigned TU_options = ITUI->TU_options;
@@ -584,18 +571,18 @@
if (CInvok->getFrontendOpts().Inputs.empty())
return;
- std::unique_ptr<MemBufferOwner> BufOwner(new MemBufferOwner());
+ typedef SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 8> MemBufferOwner;
+ std::unique_ptr<MemBufferOwner> BufOwner(new MemBufferOwner);
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<MemBufferOwner>
- BufOwnerCleanup(BufOwner.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<MemBufferOwner> BufOwnerCleanup(
+ BufOwner.get());
- for (unsigned I = 0; I != num_unsaved_files; ++I) {
- StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
- llvm::MemoryBuffer *Buffer =
- llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
- CInvok->getPreprocessorOpts().addRemappedFile(unsaved_files[I].Filename, Buffer);
- BufOwner->Buffers.push_back(Buffer);
+ for (auto &UF : ITUI->unsaved_files) {
+ llvm::MemoryBuffer *MB =
+ llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
+ BufOwner->push_back(std::unique_ptr<llvm::MemoryBuffer>(MB));
+ CInvok->getPreprocessorOpts().addRemappedFile(UF.Filename, MB);
}
// Since libclang is primarily used by batch tools dealing with
@@ -992,12 +979,22 @@
*Log << command_line_args[i] << " ";
}
- IndexSourceFileInfo ITUI = { idxAction, client_data, index_callbacks,
- index_callbacks_size, index_options,
- source_filename, command_line_args,
- num_command_line_args, unsaved_files,
- num_unsaved_files, out_TU, TU_options,
- CXError_Failure };
+ if (num_unsaved_files && !unsaved_files)
+ return CXError_InvalidArguments;
+
+ IndexSourceFileInfo ITUI = {
+ idxAction,
+ client_data,
+ index_callbacks,
+ index_callbacks_size,
+ index_options,
+ source_filename,
+ command_line_args,
+ num_command_line_args,
+ llvm::makeArrayRef(unsaved_files, num_unsaved_files),
+ out_TU,
+ TU_options,
+ CXError_Failure};
if (getenv("LIBCLANG_NOTHREADS")) {
clang_indexSourceFile_Impl(&ITUI);