using System.Collections.Generic; using System.Linq; using Upsilon.BaseTypes; namespace Upsilon.Binder { public class BoundScope { private readonly BoundScope _parentScope; private readonly Dictionary _variables; public BoundScope(BoundScope parentScope) { _parentScope = parentScope; _variables = new Dictionary(); } public BoundScope(Dictionary variables, BoundScope parentScope) { _parentScope = parentScope; _variables = variables.ToDictionary(x => x.Key.Name, x => x.Key); } public void SetVariable(VariableSymbol var) { if (_variables.ContainsKey(var.Name)) _variables[var.Name] = var; else _variables.Add(var.Name, var); } public void SetGlobalVariable(VariableSymbol var) { if (_parentScope == null) { SetVariable(var); } else { _parentScope.SetGlobalVariable(var); } } public bool TryGetVariable(string key, out VariableSymbol result) { if (_variables.TryGetValue(key, out result)) { return true; } if (_parentScope != null) { return _parentScope.TryGetVariable(key, out result); } return false; } } }