Looking for c# Keywords? Try Ask4Keywords

C# Language Семантическая модель


пример

Семантическая модель предлагает более глубокий уровень интерпретации и понимания кода по сравнению с деревом синтаксиса. Если деревья синтаксиса могут указывать имена переменных, семантические модели также дают тип и все ссылки. Деревья синтаксиса замечают вызовы методов, но семантические модели дают ссылки на точное местоположение, объявленное методом (после применения разрешения перегрузки).

var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
var sln = await workspace.OpenSolutionAsync(solutionFilePath);
var project = sln.Projects.First();
var compilation = await project.GetCompilationAsync();

foreach (var syntaxTree in compilation.SyntaxTrees)
{
    var root = await syntaxTree.GetRootAsync();

    var declaredIdentifiers = root.DescendantNodes()
        .Where(an => an is VariableDeclaratorSyntax)
        .Cast<VariableDeclaratorSyntax>();

    foreach (var di in declaredIdentifiers)
    {
        Console.WriteLine(di.Identifier);
        // => "root"

        var variableSymbol = compilation
            .GetSemanticModel(syntaxTree)
            .GetDeclaredSymbol(di) as ILocalSymbol;

        Console.WriteLine(variableSymbol.Type);
        // => "Microsoft.CodeAnalysis.SyntaxNode"

        var references = await SymbolFinder.FindReferencesAsync(variableSymbol, sln);
        foreach (var reference in references)
        {
            foreach (var loc in reference.Locations)
            {
                Console.WriteLine(loc.Location.SourceSpan);
                // => "[1375..1379)"
            }
        }
    }
}

Это выводит список локальных переменных, используя дерево синтаксиса. Затем он консультируется с семантической моделью, чтобы получить полное имя типа и найти все ссылки каждой переменной.