using NubLang.Syntax.Node; namespace NubLang; public sealed class DefinitionTable { private readonly List _topLevelNodes; public DefinitionTable(IEnumerable syntaxTrees) { _topLevelNodes = syntaxTrees.SelectMany(x => x.TopLevelNodes).ToList(); } public IEnumerable LookupLocalFunc(string @namespace, string name) { return _topLevelNodes .OfType() .Where(x => x.Namespace == @namespace && x.Name == name); } public IEnumerable LookupExternFunc(string @namespace, string name) { return _topLevelNodes .OfType() .Where(x => x.Namespace == @namespace && x.Name == name); } public IEnumerable LookupStruct(string @namespace, string name) { return _topLevelNodes .OfType() .Where(x => x.Namespace == @namespace && x.Name == name); } public IEnumerable LookupStructField(StructNode structNode, string field) { return structNode.Fields.Where(x => x.Name == field); } public IEnumerable LookupTraitFuncImpl(NubType forType, string name) { return _topLevelNodes .OfType() .Where(x => x.ForType == forType) .SelectMany(x => x.Functions) .Where(x => x.Name == name); } public IEnumerable LookupTrait(string @namespace, string name) { return _topLevelNodes .OfType() .Where(x => x.Namespace == @namespace && x.Name == name); } public IEnumerable LookupTraitFunc(TraitNode trait, string name) { return trait.Functions.Where(x => x.Name == name); } } public sealed class BoundDefinitionTable { private readonly List _topLevelNodes; public BoundDefinitionTable(IEnumerable syntaxTrees) { _topLevelNodes = syntaxTrees.SelectMany(x => x.TopLevelNodes).ToList(); } public BoundLocalFuncNode LookupLocalFunc(string @namespace, string name) { return _topLevelNodes .OfType() .First(x => x.Namespace == @namespace && x.Name == name); } public BoundExternFuncNode LookupExternFunc(string @namespace, string name) { return _topLevelNodes .OfType() .First(x => x.Namespace == @namespace && x.Name == name); } public BoundStructNode LookupStruct(string @namespace, string name) { return _topLevelNodes .OfType() .First(x => x.Namespace == @namespace && x.Name == name); } public BoundStructFieldNode LookupStructField(BoundStructNode structNode, string field) { return structNode.Fields.First(x => x.Name == field); } public IEnumerable LookupTraitImpls(BoundNubType itemType) { return _topLevelNodes .OfType() .Where(x => x.ForType == itemType); } public BoundTraitFuncImplNode LookupTraitFuncImpl(BoundNubType forType, string name) { return _topLevelNodes .OfType() .Where(x => x.ForType == forType) .SelectMany(x => x.Functions) .First(x => x.Name == name); } public BoundTraitNode LookupTrait(string @namespace, string name) { return _topLevelNodes .OfType() .First(x => x.Namespace == @namespace && x.Name == name); } public BoundTraitFuncNode LookupTraitFunc(BoundTraitNode trait, string name) { return trait.Functions.First(x => x.Name == name); } public IEnumerable GetStructs() { return _topLevelNodes.OfType(); } public IEnumerable GetTraits() { return _topLevelNodes.OfType(); } }