2

我需要编写一个实用程序来重构 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 标签?提前致谢。

4

0 回答 0