2016-08-30 2 views
2

Ich erhalte erfolgreich Abhängigkeiten zwischen Projekten mit Roslyn, und jetzt möchte ich Abhängigkeiten zwischen Klassen, ähnlich der Code-Map-Funktion in Visual Studio Enterprise.Abhängigkeiten zwischen Klassen in Roslyn erhalten

Hier ist mein Code, der "?????" Teil ist, wo ich mir vorstelle, ich könnte etwas bekommen. Ich bin jedoch sehr neu in der Roslyn-API, und ich weiß nicht, wie ich von da an weitermachen soll.

 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

Meinst du, alle verwendeten Typen mit dieser 'ClassDeclarationSyntax' zu bekommen? Sie können alle 'SyntaxNode's bekommen, das entsprechende' ISymbol' durch das semantische Modell erhalten, überprüfen ob das Symbol ein 'INamedTypeSymbol' ist oder nicht. Aber ich denke, das wird extrem langsam sein. – Tamas

+0

@ Tamas-SonarSourceTeam Ich muss Abhängigkeitsgraphen erstellen und sie in PDF ausgeben, wenn es langsam ist, ist es kein Deal Breaker. Aber ich konnte immer noch nicht herausfinden, wie ich die Operation durchführen sollte, die Sie vorschlagen. Könnten Sie vielleicht einen Code als Antwort posten? Es würde mir sehr helfen und ich würde so schnell wie möglich in meinem tatsächlichen Szenario testen. – heltonbiker

Antwort

1

Ich bin über Ihre Anforderungen nicht sicher, aber Sie können sich wahrscheinlich für die Überprüfung aller Nachkommen SyntaxNode s der Klasse gehen und das entsprechende Symbol bekommen, und es ist Art, und dann diese Art zu sammeln. Etwas wie folgt aus:

Hinweis, dass es mehrere typesForCurrentClass für eine bestimmte Klasse Symbol sein, weil der Teilklassen.

+0

Es hat funktioniert, aber es gibt mir _every_ type die Klassen verwendet, sogar .Net-Typen, Ints, Strings, etc. CodeMap (die VS Enterprise-Funktion, die ich versuche zu replizieren) legt diese Art von Sache in der Regel in "Externals" Gruppe, aber ich habe kein Interesse an diesen Abhängigkeiten. Wüssten Sie, wie 'typesForCurrentClass' nur in der Lösung definierte Typen enthält? Danke für das Interesse! – heltonbiker

+0

Ich bin mir nicht sicher, Sie können 'type.ContainingAssembly' überprüfen und sehen, ob dort etwas Nützliches ist. – Tamas

Verwandte Themen