zoukankan      html  css  js  c++  java
  • RCP: JDT 根据org.eclipse.jdt.core.IJavaElement对象获取org.eclipse.jdt.core.dom.ASTNode对象

    JDT中有两套Java文件模型映射。

    其核心类接口分别为:

    org.eclipse.jdt.core.IJavaElement和org.eclipse.jdt.core.dom.ASTNode

    IJavaElement是Java Element的通用“协议”,即是对Java包、类、方法、变量、注解等等元素的规范。

    它可以用于映射java文件,也可以映射class文件,任何java方面的元素都能找到其对应的实现类。

    ASTNode是Java ast(语法分析树)的建模,用于构建java语句,它只能用于java文件分析,对class文件无能为力。其侧重点是语法。

    举个例子,一个类,比如java.util.List

    在IJavaElement中要使用,必须有java.util.List作为IType存在。

    在ASTNode中使用,则只需要用户知道“java.util.List"这个字符串即可。

    IJavaElement常用于分析Java相关的元素

    ASTNode常用来解析和构建Java文件

    在实际使用中,我们经常会涉及到两个实现类之间的转化。

    比如根据IMethod来查找MethodDeclaration

    JDT提供了一个方法的工具类NodeFinder。使用方式如下:

    NodeFinder.perform(domUnit,
                            method.getSourceRange())

    这里要特别注意的是sourceRange,它代表了指定对象(类、方法等)在java类定义里的储存位置,它有两个标量,offset和length。

    所以,我们还可以使用以下方式:

     NodeFinder.perform(domUnit,mj.getOffset(),ms.getLength());


    这里要特别注意的地方是,如果该method的源码具备注释(comment),该方法会产生问题,会找不到MethodDeclaration,取而代之的是父级的TypeDeclaration。

    原因在于jdt(至少是3.7.0及更早版本)的BUG,IMethod记录comment的offset和length,但是ASTNode并没有相应的记录,如果使用上方的方法,NodeFinder会认为范围超限,属于类范围而非方法范围。

    所以,我们需要一个小小的改动:

    IMethod method = (IMethod) methodElement
    				.getAncestor(IJavaElement.METHOD);
    		try {
    			ISourceRange ms = method.getSourceRange();
    			ISourceRange mj = method.getJavadocRange();
    
    			if (ms.getOffset() == mj.getOffset()) {
    				// 消除注释的影响
    				return (MethodDeclaration) NodeFinder.perform(domUnit,
    						method.getSourceRange());
    			} else {
    				return (MethodDeclaration) NodeFinder.perform(domUnit,
    						mj.getOffset(),
    						ms.getLength() - mj.getOffset() + ms.getOffset());
    			}
    		} catch (JavaModelException e) {
    			e.printStackTrace();
    		}
    

     注意红色部分,它用于去除多余的注释部分,计算出准确的方法体范围。

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    【2020-MOOC-浙江大学-陈越、何钦铭-数据结构】图(第七周的笔记和编程作业)
    PTA刷题笔记(C语言) | 7-6 厘米换算英尺英寸 (15分)
    数据包设置了不允许分片Don't fragment: Set
    今晚直播:Oracle Nologging 全面总结
    DM online-远大见未来 大咖讲堂丨大数据+,信息化应用与技术落地
    PTA刷题笔记(C语言) | 7-2 I Love GPLT (5分)
    用 C 语言开发一门编程语言 — 抽象语法树
  • 原文地址:https://www.cnblogs.com/anrainie/p/4628528.html
Copyright © 2011-2022 走看看