reformat some loplugin code

to match our more normal conventions.

Also drop the 'using std' and some other cruft

Change-Id: I02ef81c5427188bc03a20b157a57a900a9d7bf0d
This commit is contained in:
Noel Grandin
2017-06-20 10:26:46 +02:00
parent 03ee996717
commit 4c0198b02c
22 changed files with 341 additions and 360 deletions

View File

@@ -26,7 +26,6 @@
using namespace clang;
using namespace llvm;
using namespace std;
namespace loplugin
{
@@ -40,55 +39,56 @@ class PluginHandler;
use Plugin::Registration.
*/
class Plugin
{
public:
struct InstantiationData
{
public:
struct InstantiationData
{
const char* name;
PluginHandler& handler;
CompilerInstance& compiler;
Rewriter* rewriter;
};
explicit Plugin( const InstantiationData& data );
virtual ~Plugin();
virtual void run() = 0;
template< typename T > class Registration;
enum { isPPCallback = false };
// Returns location right after the end of the token that starts at the given location.
SourceLocation locationAfterToken( SourceLocation location );
protected:
DiagnosticBuilder report( DiagnosticsEngine::Level level, StringRef message, SourceLocation loc = SourceLocation()) const;
bool ignoreLocation( SourceLocation loc );
bool ignoreLocation( const Decl* decl );
bool ignoreLocation( const Stmt* stmt );
CompilerInstance& compiler;
PluginHandler& handler;
/**
Returns the parent of the given AST node. Clang's internal AST representation doesn't provide this information,
it can only provide children, but getting the parent is often useful for inspecting a part of the AST.
*/
const Stmt* parentStmt( const Stmt* stmt );
Stmt* parentStmt( Stmt* stmt );
const FunctionDecl* parentFunctionDecl( const Stmt* stmt );
/**
Checks if the location is inside an UNO file, more specifically, if it forms part of the URE stable interface,
which is not allowed to be changed.
*/
bool isInUnoIncludeFile(SourceLocation spellingLocation) const;
bool isInUnoIncludeFile(const FunctionDecl*) const;
static void normalizeDotDotInFilePath(std::string&);
static bool isUnitTestMode();
private:
static void registerPlugin( Plugin* (*create)( const InstantiationData& ), const char* optionName, bool isPPCallback, bool byDefault );
template< typename T > static Plugin* createHelper( const InstantiationData& data );
enum { isRewriter = false };
const char* name;
static unordered_map< const Stmt*, const Stmt* > parents;
static void buildParents( CompilerInstance& compiler );
PluginHandler& handler;
CompilerInstance& compiler;
Rewriter* rewriter;
};
explicit Plugin( const InstantiationData& data );
virtual ~Plugin() {}
virtual void run() = 0;
template< typename T > class Registration;
enum { isPPCallback = false };
// Returns location right after the end of the token that starts at the given location.
SourceLocation locationAfterToken( SourceLocation location );
protected:
DiagnosticBuilder report( DiagnosticsEngine::Level level, StringRef message, SourceLocation loc = SourceLocation()) const;
bool ignoreLocation( SourceLocation loc );
bool ignoreLocation( const Decl* decl );
bool ignoreLocation( const Stmt* stmt );
CompilerInstance& compiler;
PluginHandler& handler;
/**
Returns the parent of the given AST node. Clang's internal AST representation doesn't provide this information,
it can only provide children, but getting the parent is often useful for inspecting a part of the AST.
*/
const Stmt* parentStmt( const Stmt* stmt );
Stmt* parentStmt( Stmt* stmt );
const FunctionDecl* parentFunctionDecl( const Stmt* stmt );
/**
Checks if the location is inside an UNO file, more specifically, if it forms part of the URE stable interface,
which is not allowed to be changed.
*/
bool isInUnoIncludeFile(SourceLocation spellingLocation) const;
bool isInUnoIncludeFile(const FunctionDecl*) const;
static void normalizeDotDotInFilePath(std::string&);
static bool isUnitTestMode();
private:
static void registerPlugin( Plugin* (*create)( const InstantiationData& ), const char* optionName, bool isPPCallback, bool byDefault );
template< typename T > static Plugin* createHelper( const InstantiationData& data );
enum { isRewriter = false };
const char* name;
static std::unordered_map< const Stmt*, const Stmt* > parents;
static void buildParents( CompilerInstance& compiler );
};
/**
Base class for rewriter plugins.
@@ -96,57 +96,57 @@ class Plugin
*/
class RewritePlugin
: public Plugin
{
public:
explicit RewritePlugin( const InstantiationData& data );
protected:
enum RewriteOption
{
public:
explicit RewritePlugin( const InstantiationData& data );
protected:
enum RewriteOption
{
// This enum allows passing just 'RemoveLineIfEmpty' to functions below.
// If the resulting line would be completely empty, it'll be removed.
RemoveLineIfEmpty = 1 << 0,
// Use this to remove the declaration/statement as a whole, i.e. all whitespace before the statement
// and the trailing semicolon (is not part of the AST element range itself).
// The trailing semicolon must be present.
RemoveWholeStatement = 1 << 1,
// Removes also all whitespace preceding and following the expression (completely, so that
// the preceding and following tokens would be right next to each other, follow with insertText( " " )
// if this is not wanted). Despite the name, indentation whitespace is not removed.
RemoveAllWhitespace = 1 << 2
};
struct RewriteOptions
: public Rewriter::RewriteOptions
{
RewriteOptions();
explicit RewriteOptions( RewriteOption option );
const int flags;
};
// syntactic sugar to be able to write 'RemoveLineIfEmpty | RemoveWholeStatement'
friend RewriteOption operator|( RewriteOption option1, RewriteOption option2 );
// These following insert/remove/replaceText functions map to functions
// in clang::Rewriter, with these differences:
// - they (more intuitively) return false on failure rather than true
// - they report a warning when the change cannot be done
// - There are more options for easier removal of surroundings of a statement/expression.
bool insertText( SourceLocation Loc, StringRef Str,
bool InsertAfter = true, bool indentNewLines = false );
bool insertTextAfter( SourceLocation Loc, StringRef Str );
bool insertTextAfterToken( SourceLocation Loc, StringRef Str );
bool insertTextBefore( SourceLocation Loc, StringRef Str );
bool removeText( SourceLocation Start, unsigned Length, RewriteOptions opts = RewriteOptions());
bool removeText( CharSourceRange range, RewriteOptions opts = RewriteOptions());
bool removeText( SourceRange range, RewriteOptions opts = RewriteOptions());
bool replaceText( SourceLocation Start, unsigned OrigLength, StringRef NewStr );
bool replaceText( SourceRange range, StringRef NewStr );
bool replaceText( SourceRange range, SourceRange replacementRange );
Rewriter* rewriter;
private:
template< typename T > friend class Plugin::Registration;
enum { isRewriter = true };
bool wouldRewriteWorkdir(SourceLocation loc);
bool reportEditFailure( SourceLocation loc );
bool adjustRangeForOptions( CharSourceRange* range, RewriteOptions options );
// This enum allows passing just 'RemoveLineIfEmpty' to functions below.
// If the resulting line would be completely empty, it'll be removed.
RemoveLineIfEmpty = 1 << 0,
// Use this to remove the declaration/statement as a whole, i.e. all whitespace before the statement
// and the trailing semicolon (is not part of the AST element range itself).
// The trailing semicolon must be present.
RemoveWholeStatement = 1 << 1,
// Removes also all whitespace preceding and following the expression (completely, so that
// the preceding and following tokens would be right next to each other, follow with insertText( " " )
// if this is not wanted). Despite the name, indentation whitespace is not removed.
RemoveAllWhitespace = 1 << 2
};
struct RewriteOptions
: public Rewriter::RewriteOptions
{
RewriteOptions() : flags( 0 ) {}
explicit RewriteOptions( RewriteOption option );
const int flags;
};
// syntactic sugar to be able to write 'RemoveLineIfEmpty | RemoveWholeStatement'
friend RewriteOption operator|( RewriteOption option1, RewriteOption option2 );
// These following insert/remove/replaceText functions map to functions
// in clang::Rewriter, with these differences:
// - they (more intuitively) return false on failure rather than true
// - they report a warning when the change cannot be done
// - There are more options for easier removal of surroundings of a statement/expression.
bool insertText( SourceLocation Loc, StringRef Str,
bool InsertAfter = true, bool indentNewLines = false );
bool insertTextAfter( SourceLocation Loc, StringRef Str );
bool insertTextAfterToken( SourceLocation Loc, StringRef Str );
bool insertTextBefore( SourceLocation Loc, StringRef Str );
bool removeText( SourceLocation Start, unsigned Length, RewriteOptions opts = RewriteOptions());
bool removeText( CharSourceRange range, RewriteOptions opts = RewriteOptions());
bool removeText( SourceRange range, RewriteOptions opts = RewriteOptions());
bool replaceText( SourceLocation Start, unsigned OrigLength, StringRef NewStr );
bool replaceText( SourceRange range, StringRef NewStr );
bool replaceText( SourceRange range, SourceRange replacementRange );
Rewriter* rewriter;
private:
template< typename T > friend class Plugin::Registration;
enum { isRewriter = true };
bool wouldRewriteWorkdir(SourceLocation loc);
bool reportEditFailure( SourceLocation loc );
bool adjustRangeForOptions( CharSourceRange* range, RewriteOptions options );
};
/**
Plugin registration helper.
@@ -161,69 +161,58 @@ class RewritePlugin
*/
template< typename T >
class Plugin::Registration
{
public:
Registration( const char* optionName, bool byDefault = !T::isRewriter );
};
{
public:
Registration( const char* optionName, bool byDefault = !T::isRewriter );
};
class RegistrationCreate
{
public:
template< typename T, bool > static T* create( const Plugin::InstantiationData& data );
};
inline
Plugin::~Plugin()
{
}
{
public:
template< typename T, bool > static T* create( const Plugin::InstantiationData& data );
};
inline
bool Plugin::ignoreLocation( const Decl* decl )
{
{
return ignoreLocation( decl->getLocation());
}
}
inline
bool Plugin::ignoreLocation( const Stmt* stmt )
{
{
// Invalid location can happen at least for ImplicitCastExpr of
// ImplicitParam 'self' in Objective C method declarations:
return stmt->getLocStart().isValid() && ignoreLocation( stmt->getLocStart());
}
}
template< typename T >
Plugin* Plugin::createHelper( const InstantiationData& data )
{
{
return new T( data );
}
}
template< typename T >
inline
Plugin::Registration< T >::Registration( const char* optionName, bool byDefault )
{
{
registerPlugin( &T::template createHelper< T >, optionName, T::isPPCallback, byDefault );
}
inline
RewritePlugin::RewriteOptions::RewriteOptions()
: flags( 0 )
{
}
}
inline
RewritePlugin::RewriteOptions::RewriteOptions( RewriteOption option )
: flags( option )
{
{
// Note that 'flags' stores also RemoveLineIfEmpty, it must be kept in sync with the base class.
if( flags & RewritePlugin::RemoveLineIfEmpty )
this->RemoveLineIfEmpty = true;
}
}
inline
RewritePlugin::RewriteOption operator|( RewritePlugin::RewriteOption option1, RewritePlugin::RewriteOption option2 )
{
{
return static_cast< RewritePlugin::RewriteOption >( int( option1 ) | int( option2 ));
}
}
// Same as pathname.startswith(prefix), except on Windows, where pathname (but
// not prefix) may also contain backslashes: