V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aresxue
V2EX  ›  Java

idea 插件开发

  •  
  •   Aresxue · 2020-12-02 21:31:31 +08:00 · 2246 次点击
    这是一个创建于 1213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    idea 插件开发的文档太贫瘠了,这里想解析 BeanUtils.copyproperties 这样的属性 copy 的字段的引用,大致就是点击字段然后展示 copy 或者被 copy 的地方,现在遇到瓶颈了,就是我拿到这个字段所在的类 PsiClass 和 BeanUtils.copyproperties 这个方法的 PsiReference 后不知道怎么把这两个结合在一起,有懂的朋友请帮助

    4 条回复    2020-12-04 14:40:15 +08:00
    retanoj
        1
    retanoj  
       2020-12-02 22:42:41 +08:00 via iPhone
    我觉得我能解决,因为我写了个
    https://plugins.jetbrains.com/plugin/15120-momo-code-sec-inspector-java-

    但是我实在没看懂楼主的描述需求
    Aresxue
        2
    Aresxue  
    OP
       2020-12-03 10:18:28 +08:00
    @retanoj 那就纯粹需求描述,现在代码里有很多 BeanUtils.copyproperties (或其他的)属性 copy 操作,但对于这种 copy 点击 idea 中的 field,是无法展示该字段的 usages 的,在查看代码时变量的修改就非常难以追踪,现在我想完成一个插件点击 field 就展示 BeanUtils.copyproperties 的地方,之前的实现思路是按照 java 反射那套思路来的(获取 field 所在 Class,找到该 class 的对象, 当这个对象被 BeanUtils.copyproperties 时,假设是 source,就获取 target 的 class,在那个 class 中按照 field 的 name 和 type 寻找,找到了就说明匹配上了,这个 BeanUtils.copyproperties 就被展现出来)
    retanoj
        3
    retanoj  
       2020-12-04 14:16:27 +08:00
    @Aresxue
    听起来可行,但应该需要多次应用 Usages of 查询
    1. 从 field 找到当前 PsiClass
    2. 从当前 PsiClass 调用 Usages of 找到使用点(应该是找 New Instance creation 吧)
    3. 从 New Instance 在 PsiNewXXXX 上拿到变量名称(或者 Reference ?)
    4. 从这个 Reference 调用 Usages of 找到 BeanUtils.copyProperties()使用点
    5. 如果为 source,则拿到 dest 的变量 PsiReference
    6. 从 dest 的 PsiReference 能找到变量定义点,接下来就再看怎么用了

    Usages of 这个功能应该与 FindUsagesManager 和 FindUsagesHandler 有关,具体用法还得再看下
    retanoj
        4
    retanoj  
       2020-12-04 14:40:15 +08:00
    @Aresxue
    Usages of 的用法,我简单试了一下,仅供参考
    ```
    PsiLocalVariable localVariable; // 假如要从一个 localVariable 开始找

    FindUsagesHandler handler =
    JavaFindUsagesHandlerFactory.getInstance(project).createFindUsagesHandler(localVariable, false);

    Collection<PsiReference> referenceCollection =
    handler.findReferencesToHighlight(localVariable, localVariable.getUseScope());
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2689 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:12 · PVG 23:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.