首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将JavaElement转换为声明ASTNode?

如何将JavaElement转换为声明ASTNode?
EN

Stack Overflow用户
提问于 2012-09-19 03:56:30
回答 1查看 1.1K关注 0票数 4

我从Eclipse (ASTNode)上读到了这篇文章,但我仍然不能将IMethod转换成相应的MethodDeclaration。

我有一个扩展点,它将弹出菜单添加到IMethod对象中。拥有这个IMethod对象,我想用一个ASTVisitor访问它。

下面是我试图从IMethod转换到MethodDeclaration的方法

代码语言:javascript
复制
public static MethodDeclaration convertToAstNode(final IMethod method) throws JavaModelException
{
    final ICompilationUnit compilationUnit = method.getCompilationUnit();

    final ASTParser astParser = ASTParser.newParser( AST.JLS4 );
    astParser.setSource( compilationUnit );
    astParser.setKind( ASTParser.K_COMPILATION_UNIT );
    astParser.setResolveBindings( true );
    astParser.setBindingsRecovery( true );

    final ASTNode rootNode = astParser.createAST( null );

    final CompilationUnit compilationUnitNode = (CompilationUnit) rootNode;

    final String key = method.getKey();

    final ASTNode javaElement = compilationUnitNode.findDeclaringNode( key );

    final MethodDeclaration methodDeclarationNode = (MethodDeclaration) javaElement;

    return methodDeclarationNode;
}

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-06-22 04:34:07

我现在意识到这个问题已经很老了,但我想发布这个解决方案,以防未来的谷歌人碰巧发现这个问题:)

在评论中发布的解决办法 EijiAdachi应该可以工作,但是我在搜索解决方案时发现了一种更“合适”的方法。

为了使ASTNode正确解析绑定,首先需要对页面的内容进行完全解析。这是通过(有点奇怪地命名为IMHO)的ASTNode.accept(ASTVisitor)方法完成的。因此,如果您的子类是ASTVisitor,您可以覆盖您所关心的所有ASTNode类型的访问方法,并将它们添加到数据结构中,这些数据结构是在对ASTNode进行充分分析之后获得的。

这个示例将使您的MethodDeclaration根节点中的所有CompilationUnit节点都可以访问(有关如何通过ASTParser类获得这些信息,请参见OP ):

代码语言:javascript
复制
public class MethodVisitor extends ASTVisitor {
  private final List <MethodDeclaration> methods = new ArrayList <> ();

  @Override
  public boolean visit (final MethodDeclaration method) {
    methods.add (method);
    return super.visit (method);
  }

  /**
   * @return an immutable list view of the methods discovered by this visitor
   */
  public List <MethodDeclaration> getMethods () {
    return Collections.unmodifiableList (methods);
  }
}

任何其他ASTNode子类型都可以使用完全相同的过程进行舍入(您可以创建单独的访问类型或将其全部放在一个)。

如果有人感兴趣,您可以在本教程文章中寻找一个更完整的示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12488318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档