From bebdd73e13560c5bc28cf7b548d2ccd800fb30c7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 20 Feb 2015 18:16:52 -0800 Subject: [PATCH] Extracted out RHS patching property logic to function. --- src/compiler/emitter.ts | 102 +++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 49 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 1df706c60f7..ec5a0fba730 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2586,58 +2586,62 @@ module ts { // (e.g. a 'get' accessor which has already been emitted along with its 'set' accessor). function tryCreatePatchingPropertyAssignment(objectLiteral: ObjectLiteralExpression, tempVar: Identifier, property: ObjectLiteralElement): Expression { var leftHandSide = createMemberAccessForPropertyName(tempVar, property.name); - var rightHandSide: Expression; - - if (property.kind === SyntaxKind.PropertyAssignment) { - rightHandSide = (property).initializer; - } - else if (property.kind === SyntaxKind.ShorthandPropertyAssignment) { - var prefix = createIdentifier(resolver.getExpressionNamePrefix((property).name)); - rightHandSide = createPropertyAccessExpression(prefix, (property).name); - } - else if (property.kind === SyntaxKind.MethodDeclaration) { - rightHandSide = createFunctionExpressionForFunctionLikeDeclaration((property).parameters, (property).body); - } - else if (property.kind === SyntaxKind.GetAccessor || property.kind === SyntaxKind.SetAccessor) { - var { firstAccessor, setAccessor, getAccessor } = getAllAccessorDeclarations(objectLiteral.properties, property); - - // Only emit the first accessor. - if (firstAccessor !== property) { - return undefined; - } - - var propertyDescriptor = createSynthesizedNode(SyntaxKind.ObjectLiteralExpression); - - var descriptorProperties = >[]; - if (getAccessor) { - var getProperty = createPropertyAssignment(createIdentifier("get"), createFunctionExpressionForFunctionLikeDeclaration(getAccessor.parameters, getAccessor.body)); - descriptorProperties.push(getProperty); - } - if (setAccessor) { - var setProperty = createPropertyAssignment(createIdentifier("set"), createFunctionExpressionForFunctionLikeDeclaration(setAccessor.parameters, setAccessor.body)); - descriptorProperties.push(setProperty); - } - - var trueExpr = createSynthesizedNode(SyntaxKind.TrueKeyword); - - var enumerableTrue = createPropertyAssignment(createIdentifier("enumerable"), trueExpr); - descriptorProperties.push(enumerableTrue); - - var configurableTrue = createPropertyAssignment(createIdentifier("configurable"), trueExpr); - descriptorProperties.push(configurableTrue); - - propertyDescriptor.properties = descriptorProperties; - - var objectDotDefineProperty = createPropertyAccessExpression(createIdentifier("Object"), createIdentifier("defineProperty")); - rightHandSide = createCallExpression(objectDotDefineProperty, createNodeArray(propertyDescriptor)); - } - else { - Debug.fail(`ObjectLiteralElement kind ${property.kind} not accounted for.`); - } + var rightHandSide = getRightHandSideOfPatchingPropertyAssignment(objectLiteral, property); return createBinaryExpression(leftHandSide, SyntaxKind.EqualsToken, rightHandSide); } + function getRightHandSideOfPatchingPropertyAssignment(objectLiteral: ObjectLiteralExpression, property: ObjectLiteralElement) { + switch (property.kind) { + case SyntaxKind.PropertyAssignment: + return (property).initializer; + + case SyntaxKind.ShorthandPropertyAssignment: + var prefix = createIdentifier(resolver.getExpressionNamePrefix((property).name)); + return createPropertyAccessExpression(prefix, (property).name); + + case SyntaxKind.MethodDeclaration: + return createFunctionExpression((property).parameters, (property).body); + + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + var { firstAccessor, getAccessor, setAccessor } = getAllAccessorDeclarations(objectLiteral.properties, property); + + // Only emit the first accessor. + if (firstAccessor !== property) { + return undefined; + } + + var propertyDescriptor = createSynthesizedNode(SyntaxKind.ObjectLiteralExpression); + + var descriptorProperties = >[]; + if (getAccessor) { + var getProperty = createPropertyAssignment(createIdentifier("get"), createFunctionExpression(getAccessor.parameters, getAccessor.body)); + descriptorProperties.push(getProperty); + } + if (setAccessor) { + var setProperty = createPropertyAssignment(createIdentifier("set"), createFunctionExpression(setAccessor.parameters, setAccessor.body)); + descriptorProperties.push(setProperty); + } + + var trueExpr = createSynthesizedNode(SyntaxKind.TrueKeyword); + + var enumerableTrue = createPropertyAssignment(createIdentifier("enumerable"), trueExpr); + descriptorProperties.push(enumerableTrue); + + var configurableTrue = createPropertyAssignment(createIdentifier("configurable"), trueExpr); + descriptorProperties.push(configurableTrue); + + propertyDescriptor.properties = descriptorProperties; + + var objectDotDefineProperty = createPropertyAccessExpression(createIdentifier("Object"), createIdentifier("defineProperty")); + return createCallExpression(objectDotDefineProperty, createNodeArray(propertyDescriptor)); + + default: + Debug.fail(`ObjectLiteralElement kind ${property.kind} not accounted for.`); + } + } + function createParenthesizedExpression(expression: Expression) { var result = createSynthesizedNode(SyntaxKind.ParenthesizedExpression); result.expression = expression; @@ -2685,7 +2689,7 @@ module ts { return result; } - function createFunctionExpressionForFunctionLikeDeclaration(parameters: NodeArray, body: Block): FunctionExpression { + function createFunctionExpression(parameters: NodeArray, body: Block): FunctionExpression { var result = createSynthesizedNode(SyntaxKind.FunctionExpression); result.parameters = parameters; result.body = body;