import { Helper, DynamicScope } from '../environment'; import { PublicVM } from '../vm/append'; import { SymbolTable } from '@glimmer/interfaces'; import { EvaluatedArgs } from '../compiled/expressions/args'; import { CONSTANT_TAG, RevisionTag, PathReference, UpdatableTag, combine } from '@glimmer/reference'; import { Opaque } from '@glimmer/util'; class DynamicVarReference implements PathReference { public tag: RevisionTag; private varTag: UpdatableTag; constructor(private scope: DynamicScope, private nameRef: PathReference) { let varTag = this.varTag = new UpdatableTag(CONSTANT_TAG); this.tag = combine([nameRef.tag, varTag]); } value(): Opaque { return this.getVar().value(); } get(key: string): PathReference { return this.getVar().get(key); } private getVar(): PathReference { let name = String(this.nameRef.value()); let ref = this.scope.get(name); this.varTag.update(ref.tag); return ref; } } function getDynamicVar(vm: PublicVM, args: EvaluatedArgs, _symbolTable: SymbolTable): PathReference { let scope = vm.dynamicScope(); let nameRef = args.positional.at(0); return new DynamicVarReference(scope, nameRef); } export default (getDynamicVar as Helper);