java - 以编程方式重构参数名称

标签 java eclipse parameters refactoring

使用 eclipse 的 jdt 重构框架,我试图将两个不同的代码库转换为相同的名称。它们几乎是相同的代码库,只是名称不同。 函数/字段/类重命名工作正常,但是当涉及到参数时,它对我大喊大叫,工作台尚未创建。但是,我正在尝试在 headless 庄园中执行此操作。

private void refactor(String task, IJavaElement element, String new_name) throws CoreException
{
    RefactoringStatus status = new RefactoringStatus();

    RefactoringContribution contrib = RefactoringCore.getRefactoringContribution(task);
    RenameJavaElementDescriptor rnDesc = (RenameJavaElementDescriptor)contrib.createDescriptor();
    rnDesc.setFlags(JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING);
    rnDesc.setProject(element.getJavaProject().getProject().getName());
    rnDesc.setUpdateReferences(true);
    rnDesc.setJavaElement(element);
    rnDesc.setNewName(new_name);

    Refactoring ref = rnDesc.createRefactoring(status);

    ref.checkInitialConditions(NULL_MON);
    ref.checkFinalConditions(NULL_MON);

    Change change = ref.createChange(NULL_MON);
    change.perform(NULL_MON);
}

这很好用:

for (IMethod method : type.getMethods())
{
    refactor(IJavaRefactorings.RENAME_METHOD, method, {new name});
}

这不是:

for (IMethod method : type.getMethods())
{
    for (ILocalVariable param : method.getParameters())
    {
        refactor(IJavaRefactorings.RENAME_LOCAL_VARIABLE, param, {new name});
    }
}

还有错误,正如我所说,我需要在 headless 庄园中执行此操作{所以不能制作工作台}

java.lang.IllegalStateException: Workbench has not been created yet.
    at org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)
    at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.install(ASTProvider.java:245)
    at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.<init>(ASTProvider.java:236)
    at org.eclipse.jdt.internal.ui.JavaPlugin.getASTProvider(JavaPlugin.java:710)
    at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:128)
    at org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser.parseWithASTProvider(RefactoringASTParser.java:119)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RenameLocalVariableProcessor.initAST(RenameLocalVariableProcessor.java:231)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RenameLocalVariableProcessor.checkInitialConditions(RenameLocalVariableProcessor.java:218)
    at org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring.checkInitialConditions(ProcessorBasedRefactoring.java:203)

更新: 取得了一些进展,现在我可以重构不是重写的函数。但是任何覆盖另一个或接口(interface)的函数都会搞砸:

F_ARGUMENTS = JavaRefactoringDescriptor.class.getDeclaredField("fArguments");
F_ARGUMENTS.setAccessible(true);

private void refactor(IMethod method, String[] names) throws CoreException
{
    /* My attempt to fix the interface issues, causes duplicate functions instead of renaming the parameters
    IMethod parent = null;
    if (method.getDeclaringType().isInterface())
    {
        parent = MethodChecks.overridesAnotherMethod(method, method.getDeclaringType().newSupertypeHierarchy(NULL_MON));
    }
    else if (MethodChecks.isVirtual(method))
    {
        ITypeHierarchy hierarchy = method.getDeclaringType().newTypeHierarchy(NULL_MON);
        parent = MethodChecks.isDeclaredInInterface(method, hierarchy, NULL_MON);
        if (parent == null)
        {
            parent = MethodChecks.overridesAnotherMethod(method, hierarchy);
        }
    }

    parent = (parent == null ? method : parent);
    if (!method.equals(parent))
    {
        refactor(parent, names);
        return;
    }*/

    String task = IJavaRefactorings.CHANGE_METHOD_SIGNATURE;
    RefactoringStatus status = new RefactoringStatus();

    ChangeMethodSignatureRefactoringContribution contrib = (ChangeMethodSignatureRefactoringContribution)RefactoringCore.getRefactoringContribution(task);
    ChangeMethodSignatureDescriptor desc = (ChangeMethodSignatureDescriptor)contrib.createDescriptor();
    desc.setFlags(JavaRefactoringDescriptor.JAR_MIGRATION |
                  JavaRefactoringDescriptor.JAR_REFACTORING |
                  RefactoringDescriptor.MULTI_CHANGE |
                  RefactoringDescriptor.STRUCTURAL_CHANGE);

    Map<String, String> args = null;
    try
    {
        args = (Map<String, String>)F_ARGUMENTS.get(desc);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    String project = method.getJavaProject().getProject().getName();

    desc.setProject(method.getJavaProject().getProject().getName());

    args.put("input", JavaRefactoringDescriptorUtil.elementToHandle(project, method));
    args.put("name", method.getElementName());
    args.put("deprecate", "false");
    args.put("delegate", "true");        

    boolean changed = false;
    int x = 0;
    for (ILocalVariable param : method.getParameters())
    {
        if (!param.getElementName().equals(names[x]))
        {
            changed = true;
        }
        String type = "String"; //Doesn't seem to actually matter as long as they are both the same
        String info = type + " " + param.getElementName() + " " + x + " " + 
                      type + " " + names[x] + " false";
        args.put("parameter" + (x + 1), info);
        x++;
    }
    if (changed)
    {
        refactor(desc.createRefactoring(status));
    }
}

最佳答案

这是我想出的:

ChangeSignatureProcessor changeSignatureProcessor = new ChangeSignatureProcessor((IMethod) node.resolveBinding().getJavaElement());

ParameterInfo info=new ParameterInfo("FormContext", "formContext", ParameterInfo.INDEX_FOR_ADDED);
info.setDefaultValue("formContext");
changeSignatureProcessor.getParameterInfos().add(0,info);

RefactoringStatus status = new RefactoringStatus();
CheckConditionsContext context= new CheckConditionsContext();
context.add(new ValidateEditChecker(null));
context.add(new ResourceChangeChecker());

changeSignatureProcessor.checkInitialConditions(monitor);
changeSignatureProcessor.checkFinalConditions(monitor,context);

changeSignatureProcessor.createChange(monitor).perform(monitor);

关于java - 以编程方式重构参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408614/

相关文章:

java - 解析小于 6 位的纳秒

java - 如何使用 Angular 4 在 Spring Boot 中显示存储的图像?

java - 仅在 Eclipse 中存在反序列化问题

带有参数作为私有(private)成员的c++构造函数

java - 在构造函数中使用 getter 初始化变量

java - 我成功地将maven包部署到jcenter,但是当我在其他项目上使用这个包时,它给了我一个错误

java - OpenGL 着色器未传递正确的纹理坐标

eclipse - 有没有办法设置相对于 .project 文件的链接资源?

Eclipse 双击断点行号

spring - 如何更改 datatable.net 中的参数名称,例如 : "draw", "recordsTotal"、 "recordsFiltered"