2016-08-30 9 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'をすべて取得し、セマンティックモデルを通して対応する' ISymbol'を取得し、シンボルが 'INamedTypeSymbol'かどうかを確認してください。しかし、これは非常に遅いと思う。 – Tamas

+0

@ Tamas-SonarSourceTeam依存関係グラフを生成してPDFに出力する必要があるため、処理が遅い場合は取引遮断器ではありません。しかし、私はあなたが提案する操作をどのように実行するのかまだ分かりません。おそらく答えとしていくつかのコードを投稿できますか?それは私を大いに助け、私はできるだけ早く私の実際のシナリオでテストします。 – heltonbiker

答えて

1

私はあなたの要件についてはよく分からないんだけど、あなたはおそらくクラスのすべての子孫SyntaxNode秒をチェックするために行くと、対応するシンボルを取得し、それがタイプだし、その後、これらのタイプを収集することができます。なぜなら部分クラスについてクラスシンボルに対して複数のtypesForCurrentClassがあり得ること

注:以下のような何か。

+0

これはうまくいきましたが、.NETのタイプ、int、文字列など、クラスが使用する_every_タイプを提供しています。CodeMap(複製しようとしているVSエンタープライズ機能)は、通常、私はこれらの依存関係に現在興味がありません。 'typesForCurrentClass'にソリューション内で定義された型だけを含める方法を知っていますか?興味ありがとう! – heltonbiker

+0

私は 'type.ContainingAssembly'をチェックし、そこに何か役に立つかどうかは確かではありません。 – Tamas

関連する問題