从 Roslyn CompilationUnitSyntax 获取嵌套类

问题描述 投票:0回答:1

我正在使用 Roslyn 解析一些 C# 文件,以生成 TypeScript 类型。

var source = System.IO.File.ReadAllText(pathToCSharpFile);
var tree = CSharpSyntaxTree.ParseText(source);
var root = (CompilationUnitSyntax) tree.GetRoot();

我从根开始递归地遍历树以获取有关属性、字段和嵌套类的信息。

namespace MyNamespace
{
    public class Foo
    {
        public Bar BarProp { get; set; }

        public Baz BazProp { get; set; }

        public class Bar
        {
        }
    }
}

TypeScript对此的定义必须变成:

interface Foo {
    barProp: Foo.Bar;
    bazProp: Baz;
}

namespace Foo {
    interface Bar {
    }
}

令我困惑的是如何确定 BarProp 的类型是嵌套类,以便在 TypeScript 定义中正确指定 barProp 的类型。

使用 PropertyDeclarationSyntax、FieldDeclarationSyntax 和 ClassDeclarationSyntax 时此信息是否可用,或者我是否需要使用不同的方法来推断正确的类型?

c# typescript code-generation roslyn
1个回答
0
投票

为了确定嵌套了哪些类,您可以使用

CSharpSyntaxWalker
来分析类声明(它将为您执行递归树遍历,您只需覆盖
VisitXXX
,其中 XXX 是您要分析的节点)。如果该类声明不在命名空间声明中1,那么它是一个嵌套类:

public class Walker : CSharpSyntaxWalker
{
    public override void VisitClassDeclaration(ClassDeclarationSyntax node)
    {
        if (!(node.Parent is NamespaceDeclarationSyntax))
        {
            // Code to apply to nested classes
        }

        base.VisitClassDeclaration(node);
    }
}

为了让它走遍你的节点,你只需要做

new Walker().Visit(root);

1您还可以处理顶级语句或在全局命名空间中声明的类,在这种情况下,

node.Parent
似乎是
CompilationUnitSyntax
,至少当我使用您问题的代码时创建语法树

© www.soinside.com 2019 - 2024. All rights reserved.