Roslyn解析了不带工作区的语法树

本文关键字:工作区 语法树 Roslyn | 更新日期: 2023-09-27 18:28:36

我正在尝试使用Roslyn创建一个C#代码编辑器。我想得到一个解析的语法树,这样我就可以添加代码完成支持。

但是,我不能使用工作区,因为它们在iOS上已损坏。

因此,我试图使用Compilations直接访问C#编译器(这是对的吗?)。API很简单,但我不知道如何获取类型的成员信息。

具体来说,我希望看到类C的Members属性,该属性包含对完全声明的D类的引用。

但是,INamedTypeSymbol没有任何有用的信息

如何从CSharpCompilation中获取丰富的类型信息?

var cst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseCompilationUnit (
    "public class C { public D foo; }");
var dst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseCompilationUnit (
    "public class D { public C bar; }");
var comp = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.
    Create ("Poo").
    AddSyntaxTrees (cst.SyntaxTree).
    AddSyntaxTrees (dst.SyntaxTree);
var classC = comp.GetSymbolsWithName (n => n == "C").FirstOrDefault (); //= C
var classD = comp.GetSymbolsWithName (n => n == "D").FirstOrDefault (); //= D
var otherClassC = comp.GetTypeByMetadataName ("C"); //= C
Console.WriteLine ("C = " + classC);

Roslyn解析了不带工作区的语法树

您正在寻找GetMembers()方法,它返回类型中所有声明的成员。