2016-08-30 137 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