* Flattens an ObjectBindingOrAssignmentPattern into zero or more bindings or assignments. * * @param flattenContext Options used to control flattening. * @param parent The parent element of the pattern. * @param pattern The ObjectBindingOrAssignmentPattern to flatten. * @par
(flattenContext, parent, pattern, value, location)
| 91235 | * @param location The location to use for source maps and comments. |
| 91236 | */ |
| 91237 | function flattenObjectBindingOrAssignmentPattern(flattenContext, parent, pattern, value, location) { |
| 91238 | var elements = ts.getElementsOfBindingOrAssignmentPattern(pattern); |
| 91239 | var numElements = elements.length; |
| 91240 | if (numElements !== 1) { |
| 91241 | // For anything other than a single-element destructuring we need to generate a temporary |
| 91242 | // to ensure value is evaluated exactly once. Additionally, if we have zero elements |
| 91243 | // we need to emit *something* to ensure that in case a 'var' keyword was already emitted, |
| 91244 | // so in that case, we'll intentionally create that temporary. |
| 91245 | var reuseIdentifierExpressions = !ts.isDeclarationBindingElement(parent) || numElements !== 0; |
| 91246 | value = ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location); |
| 91247 | } |
| 91248 | var bindingElements; |
| 91249 | var computedTempVariables; |
| 91250 | for (var i = 0; i < numElements; i++) { |
| 91251 | var element = elements[i]; |
| 91252 | if (!ts.getRestIndicatorOfBindingOrAssignmentElement(element)) { |
| 91253 | var propertyName = ts.getPropertyNameOfBindingOrAssignmentElement(element); |
| 91254 | if (flattenContext.level >= 1 /* FlattenLevel.ObjectRest */ |
| 91255 | && !(element.transformFlags & (16384 /* TransformFlags.ContainsRestOrSpread */ | 32768 /* TransformFlags.ContainsObjectRestOrSpread */)) |
| 91256 | && !(ts.getTargetOfBindingOrAssignmentElement(element).transformFlags & (16384 /* TransformFlags.ContainsRestOrSpread */ | 32768 /* TransformFlags.ContainsObjectRestOrSpread */)) |
| 91257 | && !ts.isComputedPropertyName(propertyName)) { |
| 91258 | bindingElements = ts.append(bindingElements, ts.visitNode(element, flattenContext.visitor)); |
| 91259 | } |
| 91260 | else { |
| 91261 | if (bindingElements) { |
| 91262 | flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); |
| 91263 | bindingElements = undefined; |
| 91264 | } |
| 91265 | var rhsValue = createDestructuringPropertyAccess(flattenContext, value, propertyName); |
| 91266 | if (ts.isComputedPropertyName(propertyName)) { |
| 91267 | computedTempVariables = ts.append(computedTempVariables, rhsValue.argumentExpression); |
| 91268 | } |
| 91269 | flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, /*location*/ element); |
| 91270 | } |
| 91271 | } |
| 91272 | else if (i === numElements - 1) { |
| 91273 | if (bindingElements) { |
| 91274 | flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); |
| 91275 | bindingElements = undefined; |
| 91276 | } |
| 91277 | var rhsValue = flattenContext.context.getEmitHelperFactory().createRestHelper(value, elements, computedTempVariables, pattern); |
| 91278 | flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element); |
| 91279 | } |
| 91280 | } |
| 91281 | if (bindingElements) { |
| 91282 | flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern); |
| 91283 | } |
| 91284 | } |
| 91285 | /** |
| 91286 | * Flattens an ArrayBindingOrAssignmentPattern into zero or more bindings or assignments. |
| 91287 | * |
no test coverage detected