在Roslyn中获取类之间的依赖关系

本文关键字:依赖 关系 之间 Roslyn 获取 | 更新日期: 2023-09-27 18:05:02

我成功地获得了Roslyn项目之间的依赖关系,现在我想获得类之间的依赖关系,类似于Visual Studio Enterprise中的代码映射功能。

这是我的代码,"?????"部分是我想象我可以得到的东西。虽然我对Roslyn API很陌生,但我不知道如何从那里开始。

        Solution solution = MSBuildWorkspace.Create()
            .OpenSolutionAsync(Path.Combine(repoRootFolder, "MySolution.sln"))
            .Result;
        ProjectDependencyGraph projdeps = solution.GetProjectDependencyGraph();
        Digraph graph = new Digraph();
        foreach (ProjectId projectId in projdeps.GetTopologicallySortedProjects())
        {
            string projName = solution.GetProject(projectId).Name;
            var projDeps = projdeps.GetProjectsThatThisProjectDirectlyDependsOn(projectId);
            foreach (ProjectId depId in projDeps)
            {
                Project dep = solution.GetProject(depId);
                Compilation compilation = dep.GetCompilationAsync().Result;
                foreach (var syntree in compilation.SyntaxTrees)
                {
                    foreach (var classNode in syntree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>())
                    {
                        var classesThisClassNodeReferences = ?????????
                    }
                }
                string depName = dep.Name;
                graph.Dependencies.Add(new Dependency
                {
                    Source = projName,
                    Target = depName
                });
            }
        }

在Roslyn中获取类之间的依赖关系

我不确定你的要求,但你可能会去检查类的所有后代SyntaxNode s,并获得相应的符号,它的类型,然后收集这些类型。如下所示:

var semantic = compilation.GetSemanticModel(syntree);
var typesForCurrentClass = classNode.DescendantNodes().Select(n => 
  semantic.GetTypeInfo(n).Type);

请注意,由于部分类的存在,一个给定的类符号可以有多个typesForCurrentClass