better error handling when writing modified source
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include <clang/Frontend/CompilerInstance.h>
|
#include <clang/Frontend/CompilerInstance.h>
|
||||||
#include <clang/Frontend/FrontendAction.h>
|
#include <clang/Frontend/FrontendAction.h>
|
||||||
#include <clang/Frontend/FrontendPluginRegistry.h>
|
#include <clang/Frontend/FrontendPluginRegistry.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "bodynotinblock.hxx"
|
#include "bodynotinblock.hxx"
|
||||||
#include "lclstaticfix.hxx"
|
#include "lclstaticfix.hxx"
|
||||||
@@ -180,19 +181,25 @@ class PluginHandler
|
|||||||
++it )
|
++it )
|
||||||
{
|
{
|
||||||
const FileEntry* e = context.getSourceManager().getFileEntryForID( it->first );
|
const FileEntry* e = context.getSourceManager().getFileEntryForID( it->first );
|
||||||
string filename = std::string( e->getName()) + ".new";
|
char* filename = new char[ strlen( e->getName()) + 100 ];
|
||||||
|
sprintf( filename, "%s.new.%d", e->getName(), getpid());
|
||||||
string error;
|
string error;
|
||||||
// TODO If there will be actually plugins also modifying headers,
|
bool ok = false;
|
||||||
// race conditions should be avoided here.
|
raw_fd_ostream ostream( filename, error );
|
||||||
raw_fd_ostream ostream( filename.c_str(), error );
|
|
||||||
DiagnosticsEngine& diag = context.getDiagnostics();
|
DiagnosticsEngine& diag = context.getDiagnostics();
|
||||||
if( !error.empty())
|
if( error.empty())
|
||||||
|
{
|
||||||
|
it->second.write( ostream );
|
||||||
|
ostream.close();
|
||||||
|
if( !ostream.has_error() && rename( filename, e->getName()) == 0 )
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
ostream.clear_error();
|
||||||
|
unlink( filename );
|
||||||
|
if( !ok )
|
||||||
diag.Report( diag.getCustomDiagID( DiagnosticsEngine::Error,
|
diag.Report( diag.getCustomDiagID( DiagnosticsEngine::Error,
|
||||||
"cannot write modified source to %0 (%1) [loplugin]" )) << filename << error;
|
"cannot write modified source to %0 (%1) [loplugin]" )) << e->getName() << error;
|
||||||
else
|
delete[] filename;
|
||||||
diag.Report( diag.getCustomDiagID( DiagnosticsEngine::Note,
|
|
||||||
"modified source %0 [loplugin]" )) << filename;
|
|
||||||
it->second.write( ostream );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
Reference in New Issue
Block a user