2016-08-30 42 views
2

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

这是我的代码,“?????”部分是我想我可以得到的东西。不过,我对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 
       }); 
      } 
     } 
+0

你的意思是使用'ClassDeclarationSyntax'获得所有使用的类型吗?你可以得到所有'SyntaxNode's,通过语义模型得到相应的'ISymbol',检查符号是否是'INamedTypeSymbol'。但我认为这将非常缓慢。 – Tamas

+0

@ Tamas-SonarSourceTeam我需要生成依赖关系图并将它们输出为PDF,所以如果速度慢,它不是一个交易断路器。但我仍然无法弄清楚如何执行你提出的操作。你可能会张贴一些代码作为答案?它会帮助我很多,我会尽快在我的实际情况下进行测试。 – heltonbiker

回答

1

我不知道您的要求,但你可能可以去检查所有后代SyntaxNode S中的类,并得到相应的符号,它的类型,然后收集这些类型。像下面这样:

注意,有可能是,因为部分类的给定类符号多个typesForCurrentClass

+0

它的工作,但它给了我所有的类使用,甚至.Net类型,整数,字符串等CodeMap(VS企业功能,我试图复制)通常把这种东西放在“外部”组内,但我目前对这些依赖关系没有兴趣。你会知道一种方法来使'typesForCurrentClass'只包含解决方案中定义的类型吗?感谢您的关注! – heltonbiker

+0

我不确定,你可以检查'type.ContainingAssembly',看看有没有什么用处。 – Tamas