Ошибка при разборе цикла for с использованием javaparse

Это мой предыдущий вопрос: как разобрать цикл for с помощью Javaparser?, Я пытаюсь разобрать этот неправильный цикл for: FOR(j, k, 15, >, -); в правильной форме: for (var j = k; j > 15; j--){}, Это означает, что нужно проанализировать Class.java с классом ClassAltered.java. Мой код должен создать новый класс ClassAltered.java с правильным loop-for. Теперь мой метод для анализа цикла for прокомментирован (я еще не закончил), но в любом случае у меня та же ошибка. Я уверен, что javaparser мог разобрать некорректные операторы, но у меня проблемы с прицелами ">", "<=", "+", "-". Если я удаляю эти достопримечательности, все работает. Я использую javaparser-core-3.1.0.jar

Вот моя ошибка:

Вот мой Class.java, который я хочу проанализировать:

public class Class {
public static void main(String[] args) {
    method1();
    method2();
}

public static void method1() {
FOR(j, k, 15, >, -);
System.out.println("FOR(j, k, 15, >, -) test");
}

public static void method2() {
FOR(j, 0, 10, <=, +);
System.out.println("FOR(j, 0, 10, <=, +) test");
}
}

Вот мой Main.class:

 import com.github.javaparser.JavaParser;
 import com.github.javaparser.ast.CompilationUnit;
 import com.github.javaparser.ast.expr.*;
 import com.github.javaparser.ast.stmt.ForStmt;

 import javax.tools.*;

 import java.io.*;
 import java.util.*;

 public class Main {

 public static void main(String[] args) throws IOException {
    final String fileName = "Class.java";
    final String alteredFileName = "src\\ClassAltered.java";
    CompilationUnit cu;
    try(FileInputStream in = new FileInputStream(fileName)){
        cu = JavaParser.parse(in);
    }

    //cu.getChildNodesByType(ForStmt.class)
    //.forEach(Main::setForStatement);

    cu.getClassByName("Class").get().setName("ClassAltered");

    try(FileWriter output = new FileWriter(new File(alteredFileName), false)) {
        output.write(cu.toString());
    }

    File[] files = {new File(alteredFileName)};
    String[] options = { "-d", "out//production//Synthesis" };

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
    try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
        Iterable<? extends JavaFileObject> compilationUnits =
            fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
        compiler.getTask(
            null,
            fileManager,
            diagnostics,
            Arrays.asList(options),
            null,
            compilationUnits).call();

        diagnostics.getDiagnostics().forEach(d ->    System.out.println(d.getMessage(null)));
    }
}

 /*private static void setForStatement(ForStmt forStmt) {

    MethodCallExpr initializer = (MethodCallExpr) forStmt.getInitialization().get(0);

    if (initializer.getArguments().size() == 5
            && initializer.getArgument(1) instanceof IntegerLiteralExpr
            && initializer.getArgument(2) instanceof IntegerLiteralExpr) {
        IntegerLiteralExpr a1 = (IntegerLiteralExpr) initializer.getArgument(1);
        IntegerLiteralExpr a2 = (IntegerLiteralExpr) initializer.getArgument(2);
    }
}*/
}

1 ответ

Я не думаю, что вы должны ретранслировать, как JavaParser справляется с неверными утверждениями. Разбор неправильных утверждений является чем-то сложным и хрупким. Не существует "правильного" способа разбора чего-либо, кроме Java, в файле Java.

Мне было бы интересно, как этот код оказался в файле JavaParser: был ли он сгенерирован каким-то неисправным генератором кода? Есть ли шанс, что вы можете починить этот генератор вместо того, чтобы перепроектировать неправильный файл?

Отказ от ответственности: я участник JavaParser

Другие вопросы по тегам