You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

全局重写Reinforced.Typings CodeGenerator为[Obsolete]生成@deprecated注解

问题原因

你之前的Visitor实现错误是因为ExportContext.CurrentBlueprint仅在AST节点构建阶段生效,Visitor遍历AST的阶段该上下文已经失效,无需用这个属性溯源:所有Reinforced.Typings的AST节点都自带Reference属性,存储了生成该节点对应的原始.NET反射对象(Type、MemberInfo等),直接读取该属性即可判断是否标记了[Obsolete]特性。

推荐实现方案(全局Visitor)

该方案无需为每种类型单独重写生成器,代码复用性更高,适合全局需求。

  1. 自定义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);
    }
}
  1. 在Reinforced.Typings配置中注册自定义Visitor
    如果你用的是Fluent配置,在配置代码中添加如下行即可:
builder.Global(config => config.UseVisitor<ObsoleteMarkVisitor>());

生成器方案说明

如果你坚持用生成器方案,需要分别重写RtInterfaceGenerator、RtClassGenerator、RtEnumGenerator、RtMethodGenerator、RtPropertyGenerator等所有对应类型的生成器,每个生成器的GenerateNode方法都要加Obsolete判断逻辑,重复代码较多,不推荐使用。

内容的提问来源于stack exchange,提问作者johnrom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:45:03