idea 插件开发的文档太贫瘠了,这里想解析 BeanUtils.copyproperties 这样的属性 copy 的字段的引用,大致就是点击字段然后展示 copy 或者被 copy 的地方,现在遇到瓶颈了,就是我拿到这个字段所在的类 PsiClass 和 BeanUtils.copyproperties 这个方法的 PsiReference 后不知道怎么把这两个结合在一起,有懂的朋友请帮助
1
retanoj 2020-12-02 22:42:41 +08:00 via iPhone
我觉得我能解决,因为我写了个
https://plugins.jetbrains.com/plugin/15120-momo-code-sec-inspector-java- 但是我实在没看懂楼主的描述需求 |
2
Aresxue OP @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 就被展现出来)
|
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 有关,具体用法还得再看下 |
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()); ``` |