Spaces:
Sleeping
Sleeping
| // @flow | |
| import type {Expression} from './expression'; | |
| /** | |
| * Tracks `let` bindings during expression parsing. | |
| * @private | |
| */ | |
| class Scope { | |
| parent: ?Scope; | |
| bindings: {[_: string]: Expression}; | |
| constructor(parent?: Scope, bindings: Array<[string, Expression]> = []) { | |
| this.parent = parent; | |
| this.bindings = {}; | |
| for (const [name, expression] of bindings) { | |
| this.bindings[name] = expression; | |
| } | |
| } | |
| concat(bindings: Array<[string, Expression]>) { | |
| return new Scope(this, bindings); | |
| } | |
| get(name: string): Expression { | |
| if (this.bindings[name]) { return this.bindings[name]; } | |
| if (this.parent) { return this.parent.get(name); } | |
| throw new Error(`${name} not found in scope.`); | |
| } | |
| has(name: string): boolean { | |
| if (this.bindings[name]) return true; | |
| return this.parent ? this.parent.has(name) : false; | |
| } | |
| } | |
| export default Scope; | |