Как получить предка модуля в семантической модели roslyn?

Я хочу получить предка из семантической модели roslyn модуля.

В таком классе:

namespace Name1.Name2
{
    using System;
    ...

    public partial class MyClass : Ancestor<Param1, Param2>
    {
    }
}

Итак, я пытаюсь получить Ancestor<Param1, Param2> (а позже Param1 и Param2).

Я использую этот код для создания семантической модели:

SyntaxTree tree = CSharpSyntaxTree.ParseFile(moduleAutoGenPath);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
var nameSpace = ((NamespaceDeclarationSyntax)(root.Members[0])).Name.ToString();
var compilation = CSharpCompilation.Create(nameSpace, new[] { tree }).AddReferences(new MetadataFileReference(typeof(object).Assembly.Location));

Я ищу compilation.Assembly.Modules, но не нахожу предка..

Я на правильном пути? или совсем потерялся?


person PasTeK    schedule 14.05.2014    source источник
comment
То, что вы ищете, это базовые классы или суперклассы, а не предок модуля (я предполагаю, что это терминология, которую вы подобрали на другом языке). Я не уверен, что вы идете правильным путем, но, посетив любой узел внутри класса, вы можете использовать этот код для получения своих суперклассов: someNode.Ancestors().OfType<ClassDeclarationSyntax>().FirstOrDefault().BaseList.Types который, как я предполагаю, вы можете просто развернуть, если смотрите другое направление.   -  person Jeroen Vannevel    schedule 14.05.2014
comment
Вы правы, предок - это базовый класс. Итак, если я сделаю root.DescendantNodes().OfType<ClassDeclarationSyntax>().FirstOrDefault(), я смогу получить информацию из синтаксического дерева.   -  person PasTeK    schedule 14.05.2014


Ответы (1)


Если вы пытаетесь получить базовый класс, сделайте следующее:

var classDeclaration = someNode.Ancestors().OfType<ClassDeclarationSyntax>().First();
var semanticModel = compilation.GetSemanticModel(tree);
var type = semanticModel.GetDeclaredSymbol(classDeclaration)

Это дает вам символ семантического типа, который представляет этот синтаксис. Приведите его к ITypeSymbol, если это еще не сделано, и получите доступ к его свойству BaseType, чтобы получить базовый тип.

Как упоминалось в комментариях Jeroen: «модули» - это совершенно не связанные вещи в мире .NET. compilation.Assembly.Modules не будет иметь ничего общего с типами. В C# вы не можете использовать синтаксис для определения базового типа, потому что если у вас есть два объявления частичного класса, только одно из них должно иметь базовый тип. Единственный "правильный" способ сделать это с помощью семантики.

person Jason Malinowski    schedule 14.05.2014