當我從包含多個類的決議檔案中洗掉 CompilationUnit (JavaParser) 中的類中的“ClassOrInterfaceDeclaration”節點時,ClassOrInterfaceDeclaration.getTokenRange() 會獲取所有標記,甚至是洗掉的節點標記。例如,位置 1 和 2 的代碼片段將給出相同的結果,盡管我已經從 ClassOrInterfaceDeclaration n 中洗掉了節點。
有誰知道如何獲得正確的令牌串列?
private void RemoveOtherClassesFromSameFile(ClassOrInterfaceDeclaration n) {
n.getTokenRange() // 1
List<ClassOrInterfaceDeclaration> internalClasses = unmodifiableList(
n.getMembers().stream().filter(m -> m instanceof ClassOrInterfaceDeclaration)
.map(m -> (ClassOrInterfaceDeclaration) m).collect(toList()));
for (ClassOrInterfaceDeclaration c : internalClasses)
n.remove(c);
n.getTokenRange() // 2
}
uj5u.com熱心網友回復:
在調整包含節點的檔案后,您必須使用方法 saveAll 更新源根目錄,以將 AST 覆寫到您的檔案中,就像這樣
sourceRoot.saveAll(Paths.get(parsedFilePath));
完整示例:
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.visitor.ModifierVisitor;
import com.github.javaparser.ast.visitor.Visitable;
import com.github.javaparser.utils.SourceRoot;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
Path dirPath = Paths.get("C:\\JavaParserTest\\src\\main\\resources\\src\\");
SourceRoot sourceRoot = new SourceRoot(dirPath);
sourceRoot.tryToParse();
CompilationUnit cu = sourceRoot.parse("", dirPath.toString() "\\JavaFile.java");
cu.accept(new ModifierVisitor<Void>() {
@Override
public Visitable visit(ClassOrInterfaceDeclaration n, Void arg) {
RemoveOtherClassesFromSameFile(n, cu);
return super.visit(n, arg);
}
}, null);
sourceRoot.saveAll(Paths.get(dirPath.toString() "\\JavaFile.java"));
}
private static ClassOrInterfaceDeclaration RemoveOtherClassesFromSameFile(ClassOrInterfaceDeclaration n, CompilationUnit cu) {
List<ClassOrInterfaceDeclaration> internalClasses = (
n.getMembers().stream().filter(m -> m instanceof ClassOrInterfaceDeclaration)
.map(m -> (ClassOrInterfaceDeclaration) m).collect(Collectors.toList()));
for (ClassOrInterfaceDeclaration c : internalClasses){
n.remove(c);
}
return n;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/402947.html
標籤:
