public SymbolForest(PrimitiveSymbolTree primitiveSymbolTree, SymbolTreeBuilder symbolTreeBuilder, IEnumerable <FixedSymbolTree> packageTrees) { if (symbolTreeBuilder.Package is null) { throw new ArgumentException("Can't be builder for primitive symbols", nameof(symbolTreeBuilder)); } PrimitiveSymbolTree = primitiveSymbolTree; this.packageTrees = packageTrees.Append <ISymbolTree>(symbolTreeBuilder).ToFixedDictionary(t => t.Package !); }
public IEnumerable <Symbol> Children(Symbol symbol) { if (symbol.Package is null) { return(PrimitiveSymbolTree.Children(symbol)); } if (!packageTrees.TryGetValue(symbol.Package, out var tree)) { throw new ArgumentException("Symbol must be for one of the packages in this tree", nameof(symbol)); } return(tree.Children(symbol)); }
public SymbolForest(PrimitiveSymbolTree primitiveSymbolTree, IEnumerable <FixedSymbolTree> packageTrees) { PrimitiveSymbolTree = primitiveSymbolTree; this.packageTrees = packageTrees.ToFixedDictionary(t => t.Package !, t => (ISymbolTree)t); }