当前位置: 首页 > 知识库问答 >
问题:

如何在javaparser中使用getRange获取源代码

章烨烨
2023-03-14

例如,我可以获得开始行和结束行,但是如何获得开始行和结束行之间的源代码呢。下面是示例代码。

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

共有1个答案

陈朗
2023-03-14

你可以创建一个访问者类,比如

 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();

}
 类似资料:
  • 我能够使用以下代码获得类级变量的声明。但我只需要变量名。这是以下代码的输出-[私有布尔标志=true;]

  • 我只想得到类级别的变量声明。如何使用javaparser获取声明? 使用javaparser必须获取变量“浏览器”的详细信息,例如浏览器的类型是“KeyWord”

  • 是否可以获取不带注释的方法语句列表,我使用了,这是输出 我只想声明结果是这样的

  • 我正在分析的类: 我正在尝试使用MethodDeclaration获取变量名,但无法做到这一点。 我正在尝试获取此is的输出。 verifyAgeLimit():此。名称或名称 verifyAgeLimit():此。名称或名称 showAddress():此。地址或地址 我试图将整个方法转换为sting并读取字符串以找出名称,但它变得太复杂,而且精度也很低。 有什么办法可以解决吗?

  • github上有些插件是分为个人版和企业版的,企业版本的说是需要获取许可证,才能用。但是仍然可以直接下载下来,直接使用。 比如这个:AG-grid插件分为社区版和企业版 ,但是企业版本的代码也可以下载。 我的问题: 1.关于此类需要授权的代码,获取官方的许可后,是要怎么使用他的代码?在哪里注明? 2.如果直接使用它的代码用在公司的内部系统,被发现会怎么样?

  • 问题内容: 但是,如何在没有GUI客户端的情况下获取该语句(例如,使用psql命令行)? 问题答案: 像这样的东西,但是我不确定这是否涵盖创建聚合的所有可能方式(它确实没有考虑到使用引号引起来的标识符)