namespace NubLang.Syntax; public sealed class Module { public static Dictionary Collect(List syntaxTrees) { var modules = new Dictionary(); foreach (var syntaxTree in syntaxTrees) { var moduleDeclaration = syntaxTree.TopLevelSyntaxNodes.OfType().FirstOrDefault(); if (moduleDeclaration != null) { if (!modules.TryGetValue(moduleDeclaration.NameToken.Value, out var module)) { module = new Module(); modules.Add(moduleDeclaration.NameToken.Value, module); } module._definitions.AddRange(syntaxTree.TopLevelSyntaxNodes); } } return modules; } private readonly List _definitions = []; public List Structs(bool includePrivate) { return _definitions .OfType() .Where(x => x.Exported || includePrivate) .ToList(); } public List Functions(bool includePrivate) { return _definitions .OfType() .Where(x => x.Exported || includePrivate) .ToList(); } public List Enums(bool includePrivate) { return _definitions .OfType() .Where(x => x.Exported || includePrivate) .ToList(); } public List Imports() { return _definitions .OfType() .Select(x => x.NameToken.Value) .Distinct() .ToList(); } }