diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2012-12-20 23:08:52 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2013-01-04 15:27:26 +0100 |
commit | c26e655264f03bb8bc484130ab2f539a9f831f16 (patch) | |
tree | c25225c8deab3cdfd3d3aa11b491beb7817fa33c /compilerplugins/clang/plugin.cxx | |
parent | 217e3f2ea1e8983328364607f244daceeafca167 (diff) |
support for removing a statement as a whole
Change-Id: Icb7b017a0c76a6169f0f629bb40bf97449c75837
Diffstat (limited to 'compilerplugins/clang/plugin.cxx')
-rw-r--r-- | compilerplugins/clang/plugin.cxx | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/compilerplugins/clang/plugin.cxx b/compilerplugins/clang/plugin.cxx index 6535e1a96471..22bac0cdfe8c 100644 --- a/compilerplugins/clang/plugin.cxx +++ b/compilerplugins/clang/plugin.cxx @@ -105,22 +105,47 @@ bool RewritePlugin::insertTextBefore( SourceLocation Loc, StringRef Str ) bool RewritePlugin::removeText( SourceLocation Start, unsigned Length, RewriteOptions opts ) { - if( rewriter.RemoveText( Start, Length, opts )) - return reportEditFailure( Start ); - return true; + return removeText( SourceRange( Start, Start.getLocWithOffset( Length )), opts ); } -bool RewritePlugin::removeText( CharSourceRange range, RewriteOptions opts ) +bool RewritePlugin::removeText( SourceRange range, RewriteOptions opts ) { + if( opts.RemoveWholeStatement ) + { + if( !adjustForWholeStatement( &range )) + return reportEditFailure( range.getBegin()); + } if( rewriter.RemoveText( range, opts )) return reportEditFailure( range.getBegin()); return true; } -bool RewritePlugin::removeText( SourceRange range, RewriteOptions opts ) +bool RewritePlugin::adjustForWholeStatement( SourceRange* range ) { - if( rewriter.RemoveText( range, opts )) - return reportEditFailure( range.getBegin()); + SourceManager& SM = rewriter.getSourceMgr(); + SourceLocation fileStartLoc = SM.getLocForStartOfFile( SM.getFileID( range->getBegin())); + if( fileStartLoc.isInvalid()) + return false; + bool invalid = false; + const char* fileBuf = SM.getCharacterData( fileStartLoc, &invalid ); + if( invalid ) + return false; + const char* startBuf = SM.getCharacterData( range->getBegin(), &invalid ); + if( invalid ) + return false; + const char* endBuf = SM.getCharacterData( range->getEnd(), &invalid ); + if( invalid ) + return false; + const char* startSpacePos = startBuf; + // do not skip \n here, RemoveLineIfEmpty can take care of that + --startSpacePos; + while( startSpacePos >= fileBuf && ( *startSpacePos == ' ' || *startSpacePos == '\t' )) + --startSpacePos; + const char* semiPos = strchr( endBuf, ';' ); + if( semiPos == NULL ) + return false; + *range = SourceRange( range->getBegin().getLocWithOffset( startSpacePos - startBuf + 1 ), + range->getEnd().getLocWithOffset( semiPos - endBuf + 1 )); return true; } |