@using Microsoft.Build.Construction @using SharpIDE.Application.Features.SolutionDiscovery @if (_solutionFile is null) { return; } @foreach(var project in _rootNodes) { @GetProjectFragment(project) } @code { private SolutionFile _solutionFile = null!; private List _rootNodes = []; private Dictionary _folders = new(); private RenderFragment GetProjectFragment(ProjectInSolution project) => @ @foreach(var child in _solutionFile.ProjectsByGuid.Values.Where(s => s.ParentProjectGuid == project.ProjectGuid).OrderBy(s => s.ProjectName)) { @GetProjectFragment(child) } @if (_folders.GetValueOrDefault(project.ProjectGuid, null) is {} value) { @GetFolderFragment(value) } ; private RenderFragment GetFolderFragment(Folder folder) => @ @foreach (var subFolder in folder.Folders) { @if (subFolder.Expanded) { @GetFolderFragment(subFolder) } } @foreach (var file in folder.Files) { } ; protected override async Task OnInitializedAsync() { await Task.Run(() => LoadSolution("C:/Users/Matthew/Documents/Git/amazon/ClientPortal.sln")); } private void LoadSolution(string solutionPath) { var solutionFile = GetNodesInSolution.ParseSolutionFileFromPath("C:/Users/Matthew/Documents/Git/amazon/ClientPortal.sln"); ArgumentNullException.ThrowIfNull(solutionFile); _solutionFile = solutionFile; var rootNodes = solutionFile.ProjectsByGuid.Values.Where(p => p.ParentProjectGuid == null).OrderBy(s => s.ProjectName).ToList(); _rootNodes = rootNodes; var folders2 = _solutionFile.ProjectsByGuid.Values .Where(s => s.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat) //.Take(2) .Select(s => { var rootFolder = new Folder { Name = Path.GetFileNameWithoutExtension(s.AbsolutePath), Path = Path.GetDirectoryName(s.AbsolutePath)!, IsPseudoFolder = false }; rootFolder.Folders = rootFolder.GetSubFolders(); return (s, rootFolder); }) .ToDictionary(s => s.s.ProjectGuid, s => s.Item2); _folders = folders2!; } }