java - Google javaparser IfStmt 不计算后续 <else-if>

标签 java if-statement javaparser

我正在使用Google javaparser来解析java文件,当我尝试计算“If”语句时,似乎无法获得“else-if”语句的数量。

例如,我想解析以下代码:

    if(i>1){
      i++;
    }else if(i>2){
      i++;
    }else if(i>3){
      i++;
    }else{
      i++;
    }

我想获得循环复杂度,以便我需要计算“if”和“else-if”的数量。 当我使用Visitor模式时,我只能访问API中定义的“IfStmt”,代码如下:

    private static class IfStmtVisitor extends VoidVisitorAdapter<Void> {
    int i = 0;

    @Override
    public void visit(IfStmt n, Void arg) {
        //visit a if statement, add 1
        i++;
        if (n.getElseStmt() != null) {
            i++;
        }
    }

    public int getNumber() {
        return i;
    }
}

没有办法获得“else-if”,但带有“IfStmt”的访问者模式将整个代码块视为一个“if”语句。因此,我期望数字为 4,但实际是 2。

有人有什么想法吗?

最佳答案

一条if语句只包含一个“then语句”和一个“else语句”。 else 语句可以是隐藏的 if 语句。所以存在递归性。要跟踪您所需的复杂性,以下递归方法可能会有所帮助:

private static class IfStmtVisitor extends VoidVisitorAdapter<Void> {
    int i = 0;

    @Override
    public void visit(IfStmt n, Void arg) 
    {
        cyclomaticCount(n);
    }

    private void cyclomaticCount(IfStmt n)
    {
        // one for the if-then
        i++;
        Statement elseStmt = n.getElseStmt();
        if (elseStmt != null)
        {
            if (  IfStmt.class.isAssignableFrom(elseStmt.getClass())) 
            {
                cyclomaticCount((IfStmt) elseStmt);
            }
            else
            {
                // another for the else
                i++;
            }
        }
    }

    public int getNumber() {
        return i;
    }
}

希望有帮助。

关于java - Google javaparser IfStmt 不计算后续 <else-if>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552443/

相关文章:

java - RecyclerView 不显示 arraylist 的所有属性

java - 无法在基于PC的Java服务器上运行我的android客户端

java - Chrome 操作系统上的用户无法查看在新选项卡中打开的 .csv 或 .xls 文件

c - 为什么 C 程序给出正整数的错误输出?

JavaParser 不更新源文件

java - 在 doget() 方法中调用 servlet 的 destroy 方法

java - 如何在 'if' 条件下自动处理 IllegalArgumentException

Excel VB For循环没有遍历if语句

java - com.github.javaparser.JavaParser 找不到

java - 如何区分一个方法中MethodCallExpr中的两个方法?