фона - Вопрос нижеРеализация Metric Люкс с помощью ASTParser в Java
Я в начале реализации метрический набор в Java для Java, однако я обеспокоен тем, что мой подход не подходит.
В настоящее время я использую JDT ASTParser для каждого файла в каталоге. Это началось хорошо, и мне удалось собрать вещи вокруг подсчета строк и средних строк для каждого метода для каждого класса. Это было сделано с помощью класса MethodVisitor, который расширяет ASTVisitor и содержит посещение метода (узел MethodDeclaration).
Теперь я пытаюсь вычислить Cyclomatic Complexity для каждого метода. Я разделил тело метода и имел ComplexityVisitor, который содержит посещение (узел IfStatement) и посещение (узел ReturnStatement).
Использование этой структуры Я знаю, что в коде есть инструкция if, но я не уверен, как узнать, сколько уровней «if else» есть. Единственный метод, который может найти полезен, это node.getElseStatement(), но это возвращает то, что в основном (или мне кажется) является строкой, и поэтому придется использовать регулярное выражение, чтобы узнать количество путей, которые может принять оператор.
Так что мой вопрос:
Есть ли способ вывести сколько уровней в «если - то еще, если - еще» заявление при использовании затмений ASTParser?
или
Должен ли я искать более чистое решение, как IJavaElement или разбора кода сам ввод ключевых слов на список, то цикл обратно через них.
Некоторые образцы кода - очень много в стадии тестирования
public class Test {
private static List<ClassInfo> klasses = new ArrayList<ClassInfo>();
// Called for every file where str is what the file contains
public static void parse(String str) {
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(str.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
ClassVisitor cv = new ClassVisitor();
cu.accept(cv);
MethodVisitor methodsVisitor = new MethodVisitor(cu);
cu.accept(methodsVisitor);
ClassInfo klass = new ClassInfo(cv.getClassName(),
cu.getLineNumber(cu.getLength() - 1),
methodsVisitor.getNumberOfMethods(),
methodsVisitor.getAverageLinesPerMethod(),
methodsVisitor.getMethods());
for(int i = 0; i < klass.methods.size(); i++){
parser.setSource(klass.methods.get(i).body.toCharArray());
CyclomaticComplexityVisitor ccv = new CyclomaticComplexityVisitor();
cu.accept(ccv);
}
klasses.add(klass);
}
-
public class MethodVisitor extends ASTVisitor {
private CompilationUnit cu;
private int numberOfMethods;
private int lineCount;
private List<MethodInfo> methods = new ArrayList<MethodInfo>();
public MethodVisitor(CompilationUnit cu){
this.cu = cu;
}
public boolean visit(MethodDeclaration node){
int startPos = cu.getLineNumber(node.getStartPosition());
int endPos = cu.getLineNumber(node.getStartPosition() + node.getLength());
lineCount += (endPos - startPos);
numberOfMethods++;
String methodBody = node.getBody().toString();
MethodInfo m = new MethodInfo(node.getName().getIdentifier(),
(endPos - startPos),
node.getReturnType2());
m.body = methodBody;
methods.add(m);
return true;
}
-
public class CyclomaticComplexityVisitor extends ASTVisitor {
private int complexityScore = 0;
private int edges = 0;
private int nodes = 0;
private int exitPoints = 1;
private boolean firstReturn = true;
public boolean visit(IfStatement node){
System.out.println("THERE WAS AN IF");
String statement = node.toString();
System.out.println(statement);
return true;
}
public boolean visit(ReturnStatement node){
if (firstReturn) {
firstReturn = false;
} else {
exitPoints++;
}
return true;
}
Приветствия
Пожалуйста, включите только то, что имеет отношение к проблеме. Общее, что вы пытаетесь подойти, вероятно, выходит за рамки, хотя и немного контекста, поэтому мы можем знать, что вы пытаетесь получить, и предложить альтернативы. В этом случае ваш вопрос также немного основан на мнениях, поэтому, если вы можете добавить конкретные детали, которые были бы замечательными. –
@QPaysTaxes: А? Он хочет знать, как подсчитать глубину вложенности IF-заявлений с использованием JDT. Это точно проблема программирования, а не «мнение». (Я не эксперт JDT, поэтому я не знаю ответа, но это должно быть очень просто сделать, используя API, которые он предлагает.) –
@IraBaxter Я довольно уверен, что OP отредактировал вопрос после того, как я написал, что , Обратите внимание на 20-часовую разницу во времени. Конечно, я все равно ошибаюсь; поэтому я сказал «немного». –