UNPKG

ember-material-icons

Version:

Google Material icons for your ember-cli app

69 lines (51 loc) 1.91 kB
import * as WireFormat from '@glimmer/wire-format'; import { BaselineSyntax } from '../scanner'; import { dict, assert } from '@glimmer/util'; import { SymbolTable } from '@glimmer/interfaces'; export type Syntax = BaselineSyntax.AnyStatement; export type Name = BaselineSyntax.AnyStatement[0]; export type SpecializeFunction = (sexp: Syntax, symbolTable: SymbolTable) => Syntax; export class Specialize { private names = dict<number>(); private funcs: SpecializeFunction[] = []; add(name: Name, func: SpecializeFunction) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; } specialize(sexp: Syntax, table: SymbolTable): Syntax { let name: Name = sexp[0]; let index = this.names[name]; if (index === undefined) return sexp; let func = this.funcs[index]; assert(!!func, `expected a specialization for ${sexp[0]}`); return func(sexp, table); } } export const SPECIALIZE = new Specialize(); import S = WireFormat.Statements; import E = WireFormat.Expressions; const { Ops } = WireFormat; SPECIALIZE.add(Ops.Append, (sexp: S.Append, _symbolTable) => { let expression = sexp[1]; if (Array.isArray(expression) && E.isGet(expression)) { let path = expression[1]; if (path.length !== 1) { return [Ops.UnoptimizedAppend, sexp[1], sexp[2]]; } } return [Ops.OptimizedAppend, sexp[1], sexp[2]]; }); SPECIALIZE.add(Ops.DynamicAttr, (sexp: S.DynamicAttr, _symbolTable) => { return [Ops.AnyDynamicAttr, sexp[1], sexp[2], sexp[3], false]; }); SPECIALIZE.add(Ops.TrustingAttr, (sexp: S.TrustingAttr, _symbolTable) => { return [Ops.AnyDynamicAttr, sexp[1], sexp[2], sexp[3], true]; }); SPECIALIZE.add(Ops.Partial, (sexp: S.Partial, _table) => { let expression = sexp[1]; if (typeof expression === 'string') { return [Ops.StaticPartial, expression]; } else { return [Ops.DynamicPartial, expression]; } });