Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Как получить список всех вызываемых методов в коде C# Roslyn

#c_sharp #roslyn


Как получить список всех используемых. Например 

using System;
using System.Collections.Generic;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            String s = "sasdad";
            s.ToString();
            Console.WriteLine(""Hello, World!"");
        }
    }
}


Получить ToString.
    


Ответы

Ответ 1



Делаем вот как. Для начала создадим анализатор, как описано в этом вопросе. Нам нужно получить все вызовы методов, и вывести их. Это делается напрямую так: var workspace = MSBuildWorkspace.Create(); // подставьте путь к вашему проекту var solution = await workspace.OpenSolutionAsync(@"D:\HelloWorld.sln"); var project = solution.Projects.Single(); var compilation = await project.GetCompilationAsync(); // обходим все деревья (то есть, все файлы) foreach (var syntaxTree in compilation.SyntaxTrees) { var root = await syntaxTree.GetRootAsync(); var model = compilation.GetSemanticModel(syntaxTree); // получаем всё, что выглядеит как вызов метода var invocations = root.DescendantNodes().OfType(); foreach (var invocation in invocations) { var expression = invocation.Expression; // спрашиваем у семантического анализатора о типе выражения var symbol = model.GetSymbolInfo(expression).Symbol; if (symbol.Kind != SymbolKind.Method) continue; // выясняем дополнительнуыю информацию bool isStatic = symbol.IsStatic; var name = symbol.Name; var containingTypeName = symbol.ContainingType.ToDisplayString(); var location = invocation.GetLocation().GetLineSpan(); // и выводим Console.WriteLine($"{(isStatic ? "Static" : "Non-static")} call," + $" type = {containingTypeName}, method = {name}, location = {location}"); } } Например, для вот такого тестового кода: using System; namespace HelloWorld { class Program { static string g = string.Empty; static void Main(string[] args) { string[] strings = { "Hello ", "world" }; foreach (var s in strings) Console.Write(s.ToString() + s?.ToString()); for (int i = 0; i < strings.Length; i++) Console.Write(strings[i].ToUpper()); Console.WriteLine(); } } } получаем результат: Static call, type = System.Console, method = Write, location = Program.cs: (11,16)-(11,59) Non-static call, type = string, method = ToString, location = Program.cs: (11,30)-(11,42) Non-static call, type = string, method = ToString, location = Program.cs: (11,47)-(11,58) Static call, type = System.Console, method = Write, location = Program.cs: (13,16)-(13,41) Non-static call, type = string, method = ToUpper, location = Program.cs: (13,30)-(13,50) Static call, type = System.Console, method = WriteLine, location = Program.cs: (14,12)-(14,31)

Комментариев нет:

Отправить комментарий