using Common; using Syntax.Parsing; using Syntax.Parsing.Node; using Syntax.Typing; using Syntax.Typing.BoundNode; namespace Syntax; public class DefinitionTable { private readonly IEnumerable _syntaxTrees; public DefinitionTable(IEnumerable syntaxTrees) { _syntaxTrees = syntaxTrees; } public Optional LookupFunction(string @namespace, string name) { var definition = _syntaxTrees .Where(c => c.Namespace == @namespace) .SelectMany(c => c.Definitions) .OfType() .SingleOrDefault(f => f.Name == name); return Optional.OfNullable(definition); } public Optional LookupStruct(string @namespace, string name) { var definition = _syntaxTrees .Where(c => c.Namespace == @namespace) .SelectMany(c => c.Definitions) .OfType() .SingleOrDefault(f => f.Name == name); return Optional.OfNullable(definition); } public IEnumerable GetStructs() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } } public class BoundDefinitionTable { private readonly IEnumerable _syntaxTrees; public BoundDefinitionTable(IEnumerable syntaxTrees) { _syntaxTrees = syntaxTrees; } public Optional LookupFunc(string @namespace, string name) { var definition = _syntaxTrees .Where(c => c.Namespace == @namespace) .SelectMany(c => c.Definitions) .OfType() .SingleOrDefault(f => f.Name == name); return Optional.OfNullable(definition); } public Optional LookupStruct(string @namespace, string name) { var definition = _syntaxTrees .Where(c => c.Namespace == @namespace) .SelectMany(c => c.Definitions) .OfType() .SingleOrDefault(f => f.Name == name); return Optional.OfNullable(definition); } public IEnumerable GetStructs() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } }