File size: 1,329 Bytes
1ae2e8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace RobloxCS
{
    public sealed class MemberCollectionResult
    {
        public Dictionary<NamespaceDeclarationSyntax, List<MemberDeclarationSyntax>> Namespaces { get; set; } = [];
    }

    public sealed class MemberCollector : CSharpSyntaxWalker
    {
        private readonly Dictionary<NamespaceDeclarationSyntax, List<MemberDeclarationSyntax>> _namespaces = [];
        private readonly List<SyntaxTree> _trees;

        public MemberCollector(List<SyntaxTree> trees)
        {
            _trees = trees;
        }

        public MemberCollectionResult Collect()
        {
            foreach (var tree in _trees)
            {
                Visit(tree.GetRoot());
            }

            return new MemberCollectionResult()
            {
                Namespaces = _namespaces
            };
        }

        public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
        {
            var members = _namespaces.ContainsKey(node) ? _namespaces[node] : new List<MemberDeclarationSyntax>();
            foreach (var member in node.Members)
            {
                members.Add(member);
            }
            _namespaces[node] = members;
        }
    }
}