我成功獲取了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
});
}
}
你的意思是使用'ClassDeclarationSyntax'獲得所有使用的類型嗎?你可以得到所有'SyntaxNode's,通過語義模型得到相應的'ISymbol',檢查符號是否是'INamedTypeSymbol'。但我認爲這將非常緩慢。 – Tamas
@ Tamas-SonarSourceTeam我需要生成依賴關係圖並將它們輸出爲PDF,所以如果速度慢,它不是一個交易斷路器。但我仍然無法弄清楚如何執行你提出的操作。你可能會張貼一些代碼作爲答案?它會幫助我很多,我會盡快在我的實際情況下進行測試。 – heltonbiker