【问题标题】:Google javaparser IfStmt not counting consequent <else-if>Google javaparser IfStmt 不计算结果 <else-if>
【发布时间】:2013-07-09 15:39:11
【问题描述】:

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

比如我要解析如下代码:

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

我想获得圈复杂度,因此我需要计算“if”和“else-if”的数量。 当我使用访问者模式时,我只能访问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。

有人知道吗?

【问题讨论】:

    标签: java if-statement javaparser


    【解决方案1】:

    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;
        }
    }
    

    希望对您有所帮助。

    【讨论】:

    • 它就像魔术一样工作。太感谢了。我实际上尝试过递归,但我总是得到一个更大的数字,因为我不知道使用 isAssignablerom 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多