Extend clang_createTranslationUnitFromSourceFile() to support creating
translation units that include unsaved files. llvm-svn: 94258
This commit is contained in:
@@ -424,23 +424,15 @@ static void InitializeFileRemapping(Diagnostic &Diags,
|
||||
SourceManager &SourceMgr,
|
||||
FileManager &FileMgr,
|
||||
const PreprocessorOptions &InitOpts) {
|
||||
// Remap files in the source manager.
|
||||
for (PreprocessorOptions::remapped_file_iterator
|
||||
Remap = InitOpts.remapped_file_begin(),
|
||||
RemapEnd = InitOpts.remapped_file_end();
|
||||
// Remap files in the source manager (with buffers).
|
||||
for (PreprocessorOptions::remapped_file_buffer_iterator
|
||||
Remap = InitOpts.remapped_file_buffer_begin(),
|
||||
RemapEnd = InitOpts.remapped_file_buffer_end();
|
||||
Remap != RemapEnd;
|
||||
++Remap) {
|
||||
// Find the file that we're mapping to.
|
||||
const FileEntry *ToFile = FileMgr.getFile(Remap->second);
|
||||
if (!ToFile) {
|
||||
Diags.Report(diag::err_fe_remap_missing_to_file)
|
||||
<< Remap->first << Remap->second;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create the file entry for the file that we're mapping from.
|
||||
const FileEntry *FromFile = FileMgr.getVirtualFile(Remap->first,
|
||||
ToFile->getSize(),
|
||||
Remap->second->getBufferSize(),
|
||||
0);
|
||||
if (!FromFile) {
|
||||
Diags.Report(diag::err_fe_remap_missing_from_file)
|
||||
@@ -448,16 +440,45 @@ static void InitializeFileRemapping(Diagnostic &Diags,
|
||||
continue;
|
||||
}
|
||||
|
||||
// Override the contents of the "from" file with the contents of
|
||||
// the "to" file.
|
||||
SourceMgr.overrideFileContents(FromFile, Remap->second);
|
||||
}
|
||||
|
||||
// Remap files in the source manager (with other files).
|
||||
for (PreprocessorOptions::remapped_file_iterator
|
||||
Remap = InitOpts.remapped_file_begin(),
|
||||
RemapEnd = InitOpts.remapped_file_end();
|
||||
Remap != RemapEnd;
|
||||
++Remap) {
|
||||
// Find the file that we're mapping to.
|
||||
const FileEntry *ToFile = FileMgr.getFile(Remap->second);
|
||||
if (!ToFile) {
|
||||
Diags.Report(diag::err_fe_remap_missing_to_file)
|
||||
<< Remap->first << Remap->second;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create the file entry for the file that we're mapping from.
|
||||
const FileEntry *FromFile = FileMgr.getVirtualFile(Remap->first,
|
||||
ToFile->getSize(),
|
||||
0);
|
||||
if (!FromFile) {
|
||||
Diags.Report(diag::err_fe_remap_missing_from_file)
|
||||
<< Remap->first;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Load the contents of the file we're mapping to.
|
||||
std::string ErrorStr;
|
||||
const llvm::MemoryBuffer *Buffer
|
||||
= llvm::MemoryBuffer::getFile(ToFile->getName(), &ErrorStr);
|
||||
= llvm::MemoryBuffer::getFile(ToFile->getName(), &ErrorStr);
|
||||
if (!Buffer) {
|
||||
Diags.Report(diag::err_fe_error_opening)
|
||||
<< Remap->second << ErrorStr;
|
||||
<< Remap->second << ErrorStr;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Override the contents of the "from" file with the contents of
|
||||
// the "to" file.
|
||||
SourceMgr.overrideFileContents(FromFile, Buffer);
|
||||
|
||||
Reference in New Issue
Block a user