【问题标题】:Running an Eclipse Plugin运行 Eclipse 插件
【发布时间】:2010-11-25 20:53:37
【问题描述】:

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

如果我没记错的话,项目起点就在这里 公共类 ASTArticleActionDelegate 实现 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 - 树结构?)?但我看不出上下文菜单有什么不同!

请告诉我一个查看该项目正在运行的方法的示例,以便我能够使用它。

【问题讨论】:

  • 刚刚添加了 3 个示例来说明分析和重写 AST 的方式。

标签: java eclipse plugins eclipse-jdt


【解决方案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,点击“installation details”,点击“Plugins”,在右上角看到插件“Abstract Syntax Tree Article, Example Application Plugin”,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);

你可以走了。

【讨论】:

  • 感谢您的努力!我还发现了另一个错误......“int i = 2; System.out.println("test"); System.out.println(i); int j = 2; System.out.println("test" ); System.out.println(j);"只有第一个被改变,而不是第二个。尝试更多这些会产生更奇怪的结果。很难调试,因为带有插件的 eclipse 应用程序会挂起,然后我看不到程序在哪里运行。然后,当我调试时,我应该能够看到变量中的内容,但我无法理解那里列出的那些东西。不知道你能不能给我一些调试技巧。
  • 调试 AST 操作时的提示是首先让它在没有断点的情况下运行,然后在源代码刚刚重写的第二个 eclipse 中,执行一些 Undo ( CTRL+Z) 以查看已完成的重写类型和顺序。您可以设置断点并检查重写事件列表是否反映了您在撤消中看到的内容,并调试这些事件按该顺序设置的原因。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 2011-12-28
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多