【问题标题】:How to get the source code using getRange in javaparser如何在 javaparser 中使用 getRange 获取源代码
【发布时间】:2019-10-28 01:58:11
【问题描述】:

例如,我可以获取开始行和结束行,但是如何获取开始行和结束行之间的源代码。 此处为示例代码。

String[] cmds =new String[2];
String OS = System.getProperty("os.name");
if (OS.startsWith("Windows")) {
    cmds[0]="cmd";
    cmds[1]="/c";
}
else {
    cmds[0]="/bin/sh";
    cmds[1]="-c";
}

try {
    Process p = Runtime.getRuntime().exec(cmds);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我想得到下面的代码,就是cmds相关的定义。

String[] cmds =new String[2];
String OS = System.getProperty("os.name");
if (OS.startsWith("Windows")) {
     cmds[0]="cmd";
     cmds[1]="/c";
}
else {
     cmds[0]="/bin/sh";
     cmds[1]="-c";
}

【问题讨论】:

  • 您想在给定的两行内找到最大的Node,还是在两行内找到任何源代码?例如,如果您有一个从第 1 行到第 3 行的 for 循环,并且您的输入是 2 和 4,那么输出应该是半个 for 循环还是只是第 2-4 行中的最大节点?如果它只是半个for循环,那么我认为它会介于使用正则表达式而不是JavaParser。

标签: java javaparser


【解决方案1】:

你可以像这样创建一个访问者类

 public class RangeFinder extends VoidVisitorWithDefaults<Range> {
    List<Node> nodesFound = new ArrayList<>();


    public void defaultAction(Node n, Range givenRange) {
        //Range of element in your code
        Range rangeOfNode = n.getRange().get();

        //If your given two lines contain this node, add it 
        if (givenRange.contains(rangeOfNode))
            nodesFound.add(n);
        //Else, if it overlaps with the node, check the children of the node
        else if (givenRange.overlapsWith(rangeOfNode)) {
            n.getChildNodes().forEach(child -> child.accept(this, givenRange));
        }
    }
}

然后使用方法

 public static String findSrc(CompilationUnit cu, int beginRow, int endRow) {
      //Parse code for all nodes contained within two rows
      RangeFinder rangeFinder = new RangeFinder();
      cu.accept(rangeFinder, Range.range(beginRow, 0, endRow, 0));

      //Build string
      StringBuilder codeBuilder = new StringBuilder();
      rangeFinder.nodesFound.forEach(node -> codeBuilder.append(node.toString()).append("\n"));
      return codeBuilder.toString();

}

【讨论】:

  • 谢谢你,@Lindstorm。顺便问一下,有没有其他方法可以获取所有与变量相关的代码,包括定义和操作?
  • @heshuguo 是的,你创建了一个访问者(访问者的类型很多),你覆盖了AssignExprVariableDeclaratorVariableDeclarationExprFieldDeclaratonvisit 方法取决于您想要的变量数据类型。如果这是您首先尝试做的事情,我不建议在此答案中使用该解决方案,而只是创建一个访问者并检查访问方法本身的范围
  • 即使你只考虑代码行,我认为正则表达式会是一个更好的解决方案,因为它的代码更少。要使用正则表达式,您只需计算\n 的数量,直到您位于两行之间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多