1- import { FIELD , toBool , autoConvertAdd } from "facade/lang" ;
1+ import { FIELD , toBool , autoConvertAdd , isBlank , FunctionWrapper , BaseException } from "facade/lang" ;
2+ import { List , ListWrapper } from "facade/collection" ;
23
34export class AST {
45 eval ( context , formatters ) {
@@ -50,6 +51,28 @@ export class FieldRead extends AST {
5051 }
5152}
5253
54+ export class Formatter extends AST {
55+ constructor ( exp :AST , name :string , args :List ) {
56+ this . exp = exp ;
57+ this . name = name ;
58+ this . args = args ;
59+ this . allArgs = ListWrapper . concat ( [ exp ] , args ) ;
60+ }
61+
62+ eval ( context , formatters ) {
63+ var formatter = formatters [ this . name ] ;
64+ if ( isBlank ( formatter ) ) {
65+ throw new BaseException ( `No formatter '${ this . name } ' found!` ) ;
66+ }
67+ var evaledArgs = evalList ( context , this . allArgs , formatters ) ;
68+ return FunctionWrapper . apply ( formatter , evaledArgs ) ;
69+ }
70+
71+ visit ( visitor ) {
72+ visitor . visitFormatter ( this ) ;
73+ }
74+ }
75+
5376export class LiteralPrimitive extends AST {
5477 @FIELD ( 'final value' )
5578 constructor ( value ) {
@@ -128,4 +151,15 @@ export class AstVisitor {
128151 visitBinary ( ast :Binary ) { }
129152 visitPrefixNot ( ast :PrefixNot ) { }
130153 visitLiteralPrimitive ( ast :LiteralPrimitive ) { }
154+ visitFormatter ( ast :Formatter ) { }
131155}
156+
157+ var _evalListCache = [ [ ] , [ 0 ] , [ 0 , 0 ] , [ 0 , 0 , 0 ] , [ 0 , 0 , 0 , 0 ] , [ 0 , 0 , 0 , 0 , 0 ] ] ;
158+ function evalList ( context , exps :List , formatters ) {
159+ var length = exps . length ;
160+ var result = _evalListCache [ length ] ;
161+ for ( var i = 0 ; i < length ; i ++ ) {
162+ result [ i ] = exps [ i ] . eval ( context , formatters ) ;
163+ }
164+ return result ;
165+ }
0 commit comments