我需要编写一个实用程序来重构 c / c ++ 中的源代码。为此,我使用 Clang。Clang 使用 Visual Studio 2012 在 Windows 7 x64 上构建。
下面是需要反转条件IF
和交换代码块THEN
的代码ELSE
。
void foo(int* a, int *b)
{
if (a[0] > 1)
{
b[0] = 2;
}
else
{
b[0] = 3;
}
}
对于基础,我使用示例https://github.com/eliben/llvm-clang-samples/blob/master/src_clang/tooling_sample.cpp 为此,我绕过所有条件并更改每个条件。
class MyASTVisitor : public RecursiveASTVisitor<MyASTVisitor> {
public:
MyASTVisitor(Rewriter &R) : TheRewriter(R) {}
bool VisitStmt(Stmt *s)
{
if (isa<IfStmt>(s))
{
IfStmt * IfStatement = cast<IfStmt>(s);
Stmt * Then = IfStatement->getThen();
Stmt * Else = IfStatement->getElse();
Expr * ifCondition = IfStatement->getCond();
SourceRange conditionRange = IfStatement->getCond()->getSourceRange();
stringstream invertConditionStream;
invertConditionStream << " !( " << TheRewriter.ConvertToString(ifCondition) << " ) ";
TheRewriter.ReplaceText(conditionRange, invertConditionStream.str());
TheRewriter.ReplaceStmt(Then, Else);
TheRewriter.ReplaceStmt(Else, Then);
}
return true;
}
结果重构示例如下所示:
void foo(int* a, int *b)
{
if ( !( a[0] > 1 ) )
{
b[0] = 3;
}
else
{
b[0] = 2;
}
}
不像我喜欢的那么好,但可以工作。但是如果你搞重构,下面的程序是在应用程序的输出中得到的稀饭。
void foo(int* a, int *b)
{
if (a[0] > 1)
{
b[0] = 2;
if (a[0] > 1)
{
b[0] = 2;
}
else
{
b[0] = 3;
}
}
else
{
b[0] = 3;
}
}
我的实用程序的结果:
vo !( a[0] > 1 ) nt* a{
b[0] = 3;
}
!( a[0] > 1 {
b[0] = 2;
}
;
}
else
{
b[0] = 2;
if (a[0] > 1) {
b[0] = 2;
} else {
b[0] = 3;
}
}
}
告诉我,我做错了什么?Clang 是否还有其他一些重构功能,例如重命名变量和 goto 标签?提前致谢。