2013-07-09 1 views
0

Google 자바 파서를 사용하여 자바 파일을 구문 분석 할 때 "If"문을 계산할 때 "else-if"문을 얻을 수없는 것 같습니다. 나는 "만약"과 "다른-경우"의 수를 계산해야 할 수 있도록Google javaparser IfStmt 결과가 계산되지 않음 <else-if>

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

I가 된 Cyclomatic 복잡성을 얻으려면 :

예를 들어, 다음 코드를 구문 분석합니다. 같은 내가 방문자 패턴을 사용할 때, 나는 단지 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; 
    } 
} 

얻을 수있는 방법이 없다 "다른-경우"하지만 IfStmt "와 Visitor 패턴 "전체 코드 블록을 하나의"if "문으로 처리합니다. 그래서 숫자가 4가 될 것으로 예상하지만 2입니다.

누구나 알고 계십니까?

답변

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

희망을.

+0

그것은 마치 마법처럼 작동합니다. 정말 고맙습니다. 실제로 재귀를 시도했지만 isAssignablerom 메서드를 사용하지 않아서 항상 더 큰 숫자를 얻었습니다. – Xiansong

관련 문제