【问题标题】:Use JavaParser to refactor a java file使用 JavaParser 重构一个 java 文件
【发布时间】:2021-04-23 03:11:16
【问题描述】:

您能否使用 javaparser 库来: 重命名导入的类、方法和字段? 例如:

package org.example;

import org.example.Test;

public class Example {
    public void example() {
        Test t = new Test();
        t.someMethod();
        t.randomField;
   }
}

package org.example;

import org.example.Test123;

public class Example {
    public void example() {
        Test123t = new TestTest123);
        t.someOtherMethod();
        t.newName;
   }
}

编辑添加:
方法重载也被考虑在内,例如:

t.someOverloadedMethod(1, 2, false, null) -> t.name1(1, 2, false, null)
t.someOverloadedMethod() -> t.name2()

【问题讨论】:

    标签: java refactoring static-analysis javaparser


    【解决方案1】:

    如果 JavaParser 不构建定义变量范围的符号表,则无法可靠地执行此操作。问题是您可能会尝试重命名出现在多个范围内的变量 X。您的方法重载示例是这种情况的特例。

    【讨论】:

    • 我只想重新映射导入的东西,而不是本地变量
    • 好的,所以您想重命名导入中提到的某个名为 X 的实体。您在代码中看到的只是...X...您怎么知道特定的 X 是导入中提到的那个?如果没有范围和符号表,您将无法做到这一点。
    • 如果您不介意修复因不考虑作用域而造成的损害,您可以通过将所有 X 更改为您想要重命名的任何内容来锤击代码。如果名称 X 相对唯一(“SetASEEncyptionKey”),这可能会很好用。如果名称 X 相当通用(例如,将自定义“get”例程添加到特殊导入的类中),这可能会在大型 Java 代码上失败。回到我的主要观点:如果没有符号表和范围,你就无法可靠地做到这一点。而且我认为 JavaParser 不提供这些。我可能是错的。
    • 惭愧,有没有一个库可以让你以这种方式操作java?
    • 我认为你可以在编译器内部学习你的方式然后实现你想要的东西来弯曲 Java 编译器的内部 API。可能会很尴尬,因为 JavaC 不想成为重命名工具。我的公司(语义设计)有一个 Java 前端,其中包括名称解析,这很容易实现。但您最简单的方法可能是基于 Eclipse 的 Java 重构工具,该工具将执行可能完全符合您要求的重命名。 (我最初没有提供这个,因为我认为你想专门使用 JavaParser)
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 2014-01-05
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    • 2020-06-11
    相关资源
    最近更新 更多