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 Optional LookupTrait(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> LookupTraitImplementationForType(NubType type, string funcName) { var implementations = _syntaxTrees .SelectMany(c => c.Definitions) .OfType() .Where(c => c.ForType.Equals(type)); var implementation = implementations.SingleOrDefault(c => c.Functions.Any(x => x.Name == funcName)); var value = implementation == null ? null : new Tuple(implementation, implementation.Functions.First(x => x.Name == funcName)); return Optional.OfNullable(value); } public Optional LookupFunctionOnTrait(string @namespace, string name, string funcName) { var traitDef = LookupTrait(@namespace, name); if (traitDef.HasValue) { var function = traitDef.Value.Functions.SingleOrDefault(x => x.Name == funcName); return Optional.OfNullable(function); } return Optional.Empty(); } public IEnumerable GetStructs() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetLocalFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetExternFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetTraits() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetTraitImplementations() { 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 Optional LookupTrait(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> LookupTraitImplementationForType(NubType type, string funcName) { var implementations = _syntaxTrees .SelectMany(c => c.Definitions) .OfType() .Where(c => c.ForType.Equals(type)); var implementation = implementations.SingleOrDefault(c => c.Functions.Any(x => x.Name == funcName)); var value = implementation == null ? null : new Tuple(implementation, implementation.Functions.First(x => x.Name == funcName)); return Optional.OfNullable(value); } public Optional LookupFunctionOnTrait(string @namespace, string name, string funcName) { var traitDef = LookupTrait(@namespace, name); if (traitDef.HasValue) { var function = traitDef.Value.Functions.SingleOrDefault(x => x.Name == funcName); return Optional.OfNullable(function); } return Optional.Empty(); } public IEnumerable GetStructs() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetLocalFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetExternFunctions() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetTraits() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } public IEnumerable GetTraitImplementations() { return _syntaxTrees .SelectMany(c => c.Definitions) .OfType(); } }