有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何为JavaSource文件中的多个问题编写Eclipse快速修复程序

在重构一些遗留代码的过程中,需要创建我们自己的Eclipse快速修复程序,对代码进行一些小的修改。这(本身)在本文(德语)之后非常简单: http://jaxenter.de/artikel/Eclipse-JDT-um-eigene-Quickfixes-erweitern

快速修复(IQuickFixProcessor)是通过扩展点org.eclipse.jdt.ui.quickFixProcessors添加的,该扩展点创建一个IJavaCompletionProposal来完成工作。IQuickFixProcessor有一个AST,可以随时对其进行代码更改

我现在面临的问题是,我一次只能对一个问题进行快速修复。如果我选择了多个问题(所有问题都属于同一类型,因此我的自定义快速修复是适用的),我会得到错误“所选问题没有通用的适用快速修复”

我如何创建一个快速修复,可以用于同一类型的多个问题

对于Java源文件,使用Acanda建议的扩展点org.eclipse.ui.ide.markerResolution似乎很难实现。例如,没有可用的AST,只有一个IMarker实例。我如何获得一个IMarker的ASTCompilationUnit和冒犯的ASTNode

更一般的:JDT中是否有一个API桥来处理IMarker实例`


共 (1) 个答案

  1. # 1 楼答案

    要为IMarker获取ASTNode,请执行以下操作:

    public ASTNode getASTNodeFromMarker(IMarker marker) {
        IResource res = marker.getResource();
        if (res.getType() == IResource.FILE) {
            IFile f = (IFile)res;
            ICompilationUnit cu = (ICompilationUnit)JavaCore.create(f);
            CompilationUnit astRoot = getAstRoot(cu);
            int start = marker.getAttribute(IMarker.CHAR_START, 0);
            int end = marker.getAttribute(IMarker.CHAR_END, 0);
            NodeFinder nf = new NodeFinder(astRoot, start, end-start);
            return nf.getCoveringNode();
        }
        return null;
    }
    
    private CompilationUnit getAstRoot(ITypeRoot typeRoot) {
        CompilationUnit root = SharedASTProvider.getAST(typeRoot, SharedASTProvider.WAIT_YES, null);
        if (root == null) {
            ASTParser astParser = ASTParser.newParser(AST.JLS8);
            astParser.setSource(typeRoot);
            astParser.setResolveBindings(true);
            astParser.setStatementsRecovery(true);
            astParser.setBindingsRecovery(true);
            root = (CompilationUnit)astParser.createAST(null);
        }
        return root;  // may return null if no source available for typeRoot
    }