在Eclipse编辑器中,当前选定代码的AST是什么?

4

我需要获取Eclipse Java编辑器中当前选择的AST。基本上,我想将选定的Java代码转换为其他形式(可能是其他语言或XML等)。所以我猜想我需要获取该选择的AST。目前我只能获取简单文本作为选择。是否有解决此类问题的方法?非常感谢!

4个回答

7
有许多方便的工具可供JDT插件开发人员使用,尤其是 AST View,它几乎可以实现您所需的所有功能。因此,您只需要获取AST View的代码并检查它是如何实现的。
该插件可以从以下更新站点安装:http://www.eclipse.org/jdt/ui/update-site 使用插件spy(请在此文章中了解更多信息)开始深入研究视图类。
您正在探索JDT的不太常见(且常常没有记录)的领域,发展您的代码挖掘技能将大大提高您的表现。

谢谢,我刚开始浏览代码,已经感到乐观。会告诉你的。 - Suraj Chandran
@zvikico,谢谢。现在我能够获取所选文本的ASTNode了。现在我需要一个ASTVisitor,它可以给我节点的完全解析代码。即每个类型名称都应该是完全限定名称,以便我可以对其进行序列化并进行一些操作。 有什么想法吗?谢谢! - Suraj Chandran
我可以得到形式为String x的代码; 但我需要的是java.lang.String x; 有什么想法吗? - Suraj Chandran
1
你有一个节点。做得好。关键在于node.resolveBinding()方法,它返回IBinding实现者。例如,VariableDeclaration将解析为IVariableBinding,它具有getType()方法,该方法返回ITypeBinding。一旦获得了ITypeBinding,它将为您提供有关完全限定类型的所有信息。 - zvikico
如果这个答案对你有帮助,不妨将其标记为正确答案 :-) - zvikico
显示剩余2条评论

4
以下代码为您提供了来自CompilationUnitEditor的当前选定代码的AST节点。
        ITextEditor editor = (ITextEditor) HandlerUtil.getActiveEditor(event);
        ITextSelection sel  = (ITextSelection) editor.getSelectionProvider().getSelection();
        ITypeRoot typeRoot = JavaUI.getEditorInputTypeRoot(editor.getEditorInput());
        ICompilationUnit icu = (ICompilationUnit) typeRoot.getAdapter(ICompilationUnit.class);
        CompilationUnit cu = parse(icu);
        NodeFinder finder = new NodeFinder(cu, sel.getOffset(), sel.getLength());
        ASTNode node = finder.getCoveringNode();

JavaUI 是 JDT UI 插件的入口点。

你从哪里得到了解析函数? - sirolf2009

1

使用方法org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.getActiveEditorJavaInput()。它返回当前活动编辑器中编辑的Java元素。返回类型是org.eclipse.jdt.core.IJavaElement,但如果正在编辑的是Java文件,则运行时类型将是org.eclipse.jdt.core.ICompilationUnit

要获取AST,即org.eclipse.jdt.core.dom.CompilationUnit,可以使用以下代码:

public static CompilationUnit getCompilationUnit(ICompilationUnit icu,
        IProgressMonitor monitor) {
    final ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(icu);
    parser.setResolveBindings(true);
    final CompilationUnit ret = (CompilationUnit) parser.createAST(monitor);
    return ret;
}

请注意,这是针对 Java >= 5 的版本。对于早期版本,您需要将参数切换到ASTParser.newParser()
我知道这个问题已经有答案,但我想揭示一下 EditorUtility 类,在这里非常有用。

此方法位于内部包中,您不应该使用它。 - Cedric Beust
嗯,我想这取决于你是否正在编写内部代码 :)。 - khatchad

0
据我所知,Eclipse AST 中的每个节点都包含一个偏移量。你需要做的就是计算出你感兴趣的代码部分的偏移量,然后遍历 AST 以选择那些在这些偏移量内的节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接