全局重写Reinforced.Typings CodeGenerator为[Obsolete]生成@deprecated注解
问题原因
你之前的Visitor实现错误是因为ExportContext.CurrentBlueprint仅在AST节点构建阶段生效,Visitor遍历AST的阶段该上下文已经失效,无需用这个属性溯源:所有Reinforced.Typings的AST节点都自带Reference属性,存储了生成该节点对应的原始.NET反射对象(Type、MemberInfo等),直接读取该属性即可判断是否标记了[Obsolete]特性。
推荐实现方案(全局Visitor)
该方案无需为每种类型单独重写生成器,代码复用性更高,适合全局需求。
- 自定义Visitor实现Obsolete标记自动添加
using Reinforced.Typings.Ast; using Reinforced.Typings.Ast.Doc; using Reinforced.Typings.Visitors; using System; using System.Reflection; using System.IO; public class ObsoleteMarkVisitor : TypeScriptExportVisitor { public ObsoleteMarkVisitor(TextWriter writer, int tabLength = 4) : base(writer, tabLength) { } private void AddDeprecatedTagIfNeeded(RtNode node) { if (node.Reference is not ICustomAttributeProvider attrProvider) return; if (!Attribute.IsDefined(attrProvider, typeof(ObsoleteAttribute))) return; var obsoleteAttr = (ObsoleteAttribute)Attribute.GetCustomAttribute(attrProvider, typeof(ObsoleteAttribute)); node.Documentation ??= new RtDocumentation(); node.Documentation.TagToDescription.Add(Tuple.Create( DocTag.Deprecated, obsoleteAttr.Message ?? string.Empty )); } public override void Visit(RtClass node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtInterface node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtEnum node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtMethod node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtProperty node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtField node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } public override void Visit(RtEnumValue node) { AddDeprecatedTagIfNeeded(node); base.Visit(node); } }
- 在Reinforced.Typings配置中注册自定义Visitor
如果你用的是Fluent配置,在配置代码中添加如下行即可:
builder.Global(config => config.UseVisitor<ObsoleteMarkVisitor>());
生成器方案说明
如果你坚持用生成器方案,需要分别重写RtInterfaceGenerator、RtClassGenerator、RtEnumGenerator、RtMethodGenerator、RtPropertyGenerator等所有对应类型的生成器,每个生成器的GenerateNode方法都要加Obsolete判断逻辑,重复代码较多,不推荐使用。
内容的提问来源于stack exchange,提问作者johnrom
相关产品推荐
相关产品推荐

