| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 13:36:42 -07:00
										 |  |  | import {BindingDef, BindingFlags, NodeDef, NodeFlags, PureExpressionData, ViewData, asPureExpressionData} from './types'; | 
					
						
							|  |  |  | import {calcBindingFlags, checkAndUpdateBinding} from './util'; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  | export function purePipeDef(checkIndex: number, argCount: number): NodeDef { | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |   // argCount + 1 to include the pipe as first arg
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |   return _pureExpressionDef(NodeFlags.TypePurePipe, checkIndex, new Array(argCount + 1)); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  | export function pureArrayDef(checkIndex: number, argCount: number): NodeDef { | 
					
						
							|  |  |  |   return _pureExpressionDef(NodeFlags.TypePureArray, checkIndex, new Array(argCount)); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  | export function pureObjectDef(checkIndex: number, propToIndex: {[p: string]: number}): NodeDef { | 
					
						
							| 
									
										
										
										
											2017-07-05 14:51:39 -07:00
										 |  |  |   const keys = Object.keys(propToIndex); | 
					
						
							|  |  |  |   const nbKeys = keys.length; | 
					
						
							|  |  |  |   const propertyNames = new Array(nbKeys); | 
					
						
							|  |  |  |   for (let i = 0; i < nbKeys; i++) { | 
					
						
							|  |  |  |     const key = keys[i]; | 
					
						
							|  |  |  |     const index = propToIndex[key]; | 
					
						
							|  |  |  |     propertyNames[index] = key; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |   return _pureExpressionDef(NodeFlags.TypePureObject, checkIndex, propertyNames); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  | function _pureExpressionDef( | 
					
						
							|  |  |  |     flags: NodeFlags, checkIndex: number, propertyNames: string[]): NodeDef { | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |   const bindings: BindingDef[] = new Array(propertyNames.length); | 
					
						
							|  |  |  |   for (let i = 0; i < propertyNames.length; i++) { | 
					
						
							|  |  |  |     const prop = propertyNames[i]; | 
					
						
							|  |  |  |     bindings[i] = { | 
					
						
							| 
									
										
										
										
											2017-03-17 09:23:28 -07:00
										 |  |  |       flags: BindingFlags.TypeProperty, | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |       name: prop, | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |       ns: null, | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |       nonMinifiedName: prop, | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |       securityContext: null, | 
					
						
							|  |  |  |       suffix: null | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     // will bet set by the view definition
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |     nodeIndex: -1, | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |     parent: null, | 
					
						
							|  |  |  |     renderParent: null, | 
					
						
							|  |  |  |     bindingIndex: -1, | 
					
						
							|  |  |  |     outputIndex: -1, | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |     // regular values
 | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |     checkIndex, | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |     flags, | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |     childFlags: 0, | 
					
						
							| 
									
										
										
										
											2017-02-27 13:00:49 -08:00
										 |  |  |     directChildFlags: 0, | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |     childMatchedQueries: 0, | 
					
						
							| 
									
										
										
										
											2017-01-23 16:59:20 -08:00
										 |  |  |     matchedQueries: {}, | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |     matchedQueryIds: 0, | 
					
						
							|  |  |  |     references: {}, | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |     ngContentIndex: -1, | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |     childCount: 0, bindings, | 
					
						
							| 
									
										
										
										
											2017-03-17 09:23:28 -07:00
										 |  |  |     bindingFlags: calcBindingFlags(bindings), | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |     outputs: [], | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |     element: null, | 
					
						
							|  |  |  |     provider: null, | 
					
						
							|  |  |  |     text: null, | 
					
						
							|  |  |  |     query: null, | 
					
						
							|  |  |  |     ngContent: null | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  | export function createPureExpression(view: ViewData, def: NodeDef): PureExpressionData { | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |   return {value: undefined}; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function checkAndUpdatePureExpressionInline( | 
					
						
							|  |  |  |     view: ViewData, def: NodeDef, v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, | 
					
						
							| 
									
										
										
										
											2017-02-22 10:05:56 -08:00
										 |  |  |     v7: any, v8: any, v9: any): boolean { | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |   const bindings = def.bindings; | 
					
						
							|  |  |  |   let changed = false; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |   const bindLen = bindings.length; | 
					
						
							|  |  |  |   if (bindLen > 0 && checkAndUpdateBinding(view, def, 0, v0)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 1 && checkAndUpdateBinding(view, def, 1, v1)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 2 && checkAndUpdateBinding(view, def, 2, v2)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 3 && checkAndUpdateBinding(view, def, 3, v3)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 4 && checkAndUpdateBinding(view, def, 4, v4)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 5 && checkAndUpdateBinding(view, def, 5, v5)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 6 && checkAndUpdateBinding(view, def, 6, v6)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 7 && checkAndUpdateBinding(view, def, 7, v7)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 8 && checkAndUpdateBinding(view, def, 8, v8)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 9 && checkAndUpdateBinding(view, def, 9, v9)) changed = true; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (changed) { | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |     const data = asPureExpressionData(view, def.nodeIndex); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |     let value: any; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |     switch (def.flags & NodeFlags.Types) { | 
					
						
							|  |  |  |       case NodeFlags.TypePureArray: | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         value = new Array(bindings.length); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |         if (bindLen > 0) value[0] = v0; | 
					
						
							|  |  |  |         if (bindLen > 1) value[1] = v1; | 
					
						
							|  |  |  |         if (bindLen > 2) value[2] = v2; | 
					
						
							|  |  |  |         if (bindLen > 3) value[3] = v3; | 
					
						
							|  |  |  |         if (bindLen > 4) value[4] = v4; | 
					
						
							|  |  |  |         if (bindLen > 5) value[5] = v5; | 
					
						
							|  |  |  |         if (bindLen > 6) value[6] = v6; | 
					
						
							|  |  |  |         if (bindLen > 7) value[7] = v7; | 
					
						
							|  |  |  |         if (bindLen > 8) value[8] = v8; | 
					
						
							|  |  |  |         if (bindLen > 9) value[9] = v9; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |       case NodeFlags.TypePureObject: | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         value = {}; | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |         if (bindLen > 0) value[bindings[0].name !] = v0; | 
					
						
							|  |  |  |         if (bindLen > 1) value[bindings[1].name !] = v1; | 
					
						
							|  |  |  |         if (bindLen > 2) value[bindings[2].name !] = v2; | 
					
						
							|  |  |  |         if (bindLen > 3) value[bindings[3].name !] = v3; | 
					
						
							|  |  |  |         if (bindLen > 4) value[bindings[4].name !] = v4; | 
					
						
							|  |  |  |         if (bindLen > 5) value[bindings[5].name !] = v5; | 
					
						
							|  |  |  |         if (bindLen > 6) value[bindings[6].name !] = v6; | 
					
						
							|  |  |  |         if (bindLen > 7) value[bindings[7].name !] = v7; | 
					
						
							|  |  |  |         if (bindLen > 8) value[bindings[8].name !] = v8; | 
					
						
							|  |  |  |         if (bindLen > 9) value[bindings[9].name !] = v9; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |       case NodeFlags.TypePurePipe: | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |         const pipe = v0; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |         switch (bindLen) { | 
					
						
							|  |  |  |           case 1: | 
					
						
							|  |  |  |             value = pipe.transform(v0); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 2: | 
					
						
							|  |  |  |             value = pipe.transform(v1); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 3: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 4: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |           case 5: | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |             value = pipe.transform(v1, v2, v3, v4); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 6: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3, v4, v5); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 7: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3, v4, v5, v6); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 8: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3, v4, v5, v6, v7); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |           case 9: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3, v4, v5, v6, v7, v8); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |           case 10: | 
					
						
							|  |  |  |             value = pipe.transform(v1, v2, v3, v4, v5, v6, v7, v8, v9); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     data.value = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-02-22 10:05:56 -08:00
										 |  |  |   return changed; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 10:05:56 -08:00
										 |  |  | export function checkAndUpdatePureExpressionDynamic( | 
					
						
							|  |  |  |     view: ViewData, def: NodeDef, values: any[]): boolean { | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |   const bindings = def.bindings; | 
					
						
							|  |  |  |   let changed = false; | 
					
						
							|  |  |  |   for (let i = 0; i < values.length; i++) { | 
					
						
							|  |  |  |     // Note: We need to loop over all values, so that
 | 
					
						
							|  |  |  |     // the old values are updates as well!
 | 
					
						
							|  |  |  |     if (checkAndUpdateBinding(view, def, i, values[i])) { | 
					
						
							|  |  |  |       changed = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (changed) { | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |     const data = asPureExpressionData(view, def.nodeIndex); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |     let value: any; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |     switch (def.flags & NodeFlags.Types) { | 
					
						
							|  |  |  |       case NodeFlags.TypePureArray: | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |         value = values; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |       case NodeFlags.TypePureObject: | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         value = {}; | 
					
						
							|  |  |  |         for (let i = 0; i < values.length; i++) { | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |           value[bindings[i].name !] = values[i]; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |       case NodeFlags.TypePurePipe: | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |         const pipe = values[0]; | 
					
						
							|  |  |  |         const params = values.slice(1); | 
					
						
							|  |  |  |         value = (<any>pipe.transform)(...params); | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     data.value = value; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-02-22 10:05:56 -08:00
										 |  |  |   return changed; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  | } |