IntelliJ插件开发:是否有API管理TypeScript类型别名关联关系
问题:IntelliJ插件框架是否提供可管理TypeScript类型别名关联关系的API?
目前在开发IDEA插件,目标是实现TypeScript类型别名关联关系的展示功能,基于开源插件intellij-uml-javascript做二次扩展,需要让插件支持TypeScript类型别名的关联关系展示。当前插件已经可以正常展示类型节点,但无法呈现类型之间的依赖关联。
使用如下TypeScript代码测试:
type A = {}; type B = {}; type C = {}; type D = {}; type AB = A & B; type CD = C & D; type ABorCD = AB | CD; type A1 = A & {}; type A2 = A1 & {};
当前插件生成的UML图仅展示一堆互不连接的类型方框,完全没有呈现类型间的关联关系。
开发过程中最初尝试针对TypeScriptType编写重载的processParents()方法,实现代码如下:
private static void processParents(@NotNull TypeScriptType element, @NotNull Processor<TypeScriptType> processor) { processParents(element, processor, TypeScriptType::getSupers, Collections.emptySet()); }
实际调试发现IntelliJ的TS API中不存在TypeScriptType::getSupers方法,后续自行实现的复杂度快速上升。曾参考JSClass类原生getSupers()方法的实现逻辑做等效开发:
public JSClass @NotNull [] getSupers() { List<JSClass> superClasses = ContainerUtil.newArrayList(this.getSuperClasses()); Collections.addAll(superClasses, this.getImplementedInterfaces()); JSClass[] var10000 = (JSClass[])superClasses.toArray(JSClass.EMPTY_ARRAY); if (var10000 == null) { $$$reportNull$$$0(10); } return var10000; }
但如果走完全自行实现的路径,需要重新实现getSuperClasses等一系列底层逻辑,开发成本极高,因此确认:IntelliJ插件框架中是否提供现成API管理TypeScript类型别名的关联关系,以及对应的实现参考思路。
解答
IntelliJ插件框架没有为TypeScriptType提供与JSClass::getSupers完全对等、可直接返回关联类型的开箱即用API,但类型别名的关联解析不需要从零实现全套底层逻辑,可基于平台已有的TS类型求值能力快速完成,核心实现思路如下:
- 区分语法层PSI节点与求值后类型对象:不要直接在语法树层面的
TypeScriptType节点上硬解析关联,先通过TypeScriptService.getInstance().getTypeEvaluator()获取TS类型求值器,传入类型别名的声明PSI节点调用evaluate()方法,拿到经过TS语言服务解析完成的类型实例。 - 按类型结构提取关联:
- 交叉类型(
&)、联合类型(|)对应的求值结果实现了TypeScriptUnionOrIntersectionType接口,直接调用getTypes()方法即可获取所有组成子类型,匹配子类型对应的类型别名声明就能拿到关联关系。 - 直接引用其他类型别名的场景,求值结果为
TypeScriptTypeReference类型,调用其resolve()方法可直接拿到被引用的类型声明节点。
- 交叉类型(
- 关系注册逻辑无需完全复刻
JSClass的processParents流程:拿到关联的类型节点后直接传入UML插件的关系处理器即可,原插件中处理类继承关系的逻辑可以直接复用,仅替换父类型获取的实现部分即可。 - 实现时需要加访问标记处理循环引用、链式引用场景(比如示例中
A2->A1->A的传递依赖),设置递归展开边界,避免无限递归,也不需要展开到TS内置基础类型。
内容的提问来源于stack exchange,提问作者glenpierceworkday
相关产品推荐
相关产品推荐

