2

如何在此处的资源 [1] 下运行插件项目:http: //www.eclipse.org/articles/article.php? file=Article-JavaCodeManipulation%5FAST/index.html

如果我没看错的话,项目起点就是这里 public class ASTArticleActionDelegate implements IObjectActionDelegate -> public void run(IAction action)

public void run(IAction action) {
    if (selection instanceof IStructuredSelection) {
        ICompilationUnit lwUnit = (ICompilationUnit) ((IStructuredSelection) selection).getFirstElement();
        createActionExecutable(action.getId()).run(lwUnit);
    }
}

我知道我应该将它作为 Eclipse 应用程序运行,但是在那之后我应该怎么做才能看到一些东西呢?我只看到一个 Eclipse 应用程序启动,没有别的,没有按钮或任何东西!

我搜索“IObjectActionDelegate”,它似乎与上下文菜单有关,当我右键单击某些东西时我应该看到一些东西(IStructuredSelection - 树结构?)?但是我在上下文菜单中看不到任何区别!

只需让我知道如何查看该项目正在运行的方法示例,以便我能够使用它。

4

1 回答 1

1

测试这个 AST 项目示例 ( net.sourceforge.earticleast.app_1.0.0.zip_1.0.0.zip) 的正确方法是:

  • 解压那个包
  • 在当前的 Eclipse 工作区中导入该包中的项目
  • 右键单击项目并选择“Debug As > Eclipse Application”

(注意“调试为”,以便能够在您的第一个 Eclipse 实例中设置断点)

启动第二个 Eclipse 后,您可以:

  • 转到Help/Anout Eclipse SDK,单击“安装详细信息”,单击“插件”,然后在顶部看到插件“抽象语法树文章,示例应用程序插件”,id“ net.sourceforge.earticleast.app
  • 在第二个 Eclipse 实例的新工作区中导入任何项目(例如,您可以重新导入net.sourceforge.earticleast.app项目!)
  • 右键单击任何类并在上下文菜单中查看自定义条目:“ Ast article: Move Declaration”(检测矛盾的变量声明并将它们移动到正确位置的操作)

所以现在几乎所有东西都可以测试这些 AST 操作了。

最后一件事:创建一个 Java 单元编译能够突出那些变量声明重写。

在您导入的项目(无论它是什么)中创建一个test带有类的包:

package test;

public class Test {

    static {
        int i = 2;
        System.out.println("test");
        System.out.println(i);
    }

}

右键单击该类并选择“ Ast article: Move Declaration”:看到源代码立即被重写为:

package test;

public class Test {

    static {
        System.out.println("test");
        int i = 2;
        System.out.println(i);
    }

}

从 eclipse 的第一个实例开始,您可以在以下位置设置一些断点:

  • ASTArticleMoveVariableDeclaration:run()
  • AbstractManipulator:manipulate(final CompilationUnit unit, Collection<VariableBindingManager> managers)

看看魔法发生在哪里。

“搬家申报”的其他案例有:

static {
    int i = 2;
    System.out.println("test");
    try
    {
        System.out.println(i);          
    }
    catch(Exception e)
    {
        System.out.println(i);          
    }
}

被重写为:

static {
    System.out.println("test");
    int i = 2;
    try
    {
        System.out.println(i);          
    }
    catch(Exception e)
    {
        System.out.println(i);          
    }
}

最后,还有一个更高级的动作:

package test;

public class Test {

    static {
        int i = 2;
        i = 3;
        System.out.println(i);
    }

}

package test;

public class Test {

    static {
        i = 3;
        int i = 3;
        System.out.println(i);
    }

}

' int i = 2' 已被正确删除。但是,请注意i = 3留下的 ' ':这是因为新的声明节点 'int i = 3' i = 3' 之后添加的,而不是替换它。

经过一些调试,结果ASTRewriteBasedManipulator:addNewVariableDeclaration()忘记删除i=3应该用声明“ ”替换的初始化程序“ int i = 3”。

只需在此方法的末尾添加:

 rewrite.remove(manager.getInitializer().getParent().getParent(), null);

你很高兴。

于 2009-09-05T22:11:59.550 回答