Как да получа предшественик на модула в семантичния модел на 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(), мога да взема информация от syntaxTree.   -  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