From b34bafa1257770261d4165995559d766bb823f9d Mon Sep 17 00:00:00 2001 From: puyajun Date: Sat, 22 Jan 2022 15:49:49 +0800 Subject: [PATCH] puyajun@huawei.com builder transmission parameter Signed-off-by: puyajun Change-Id: Iad07192704e06c8c184c603e3b4d97b1e64cb801 --- compiler/src/process_component_build.ts | 14 +++++--- compiler/src/process_component_member.ts | 4 +-- compiler/src/process_custom_component.ts | 44 ++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/compiler/src/process_component_build.ts b/compiler/src/process_component_build.ts index 78d9fcebf..f0fa69d55 100644 --- a/compiler/src/process_component_build.ts +++ b/compiler/src/process_component_build.ts @@ -201,7 +201,7 @@ function processExpressionStatementChange(node: ts.ExpressionStatement, nextNode // @ts-ignore let name = node.expression.expression.escapedText.toString() let childParam: string; - if (builderParamObjectCollection.get(name) && builderParamObjectCollection.get(name).size > 0) { + if (builderParamObjectCollection.get(name) && builderParamObjectCollection.get(name).size === 1 ) { builderParamObjectCollection.get(name).forEach((item) => { childParam = item }) @@ -221,15 +221,21 @@ function processExpressionStatementChange(node: ts.ExpressionStatement, nextNode // @ts-ignore node.expression.arguments[0].properties.concat([newPropertyAssignment]), true)] } - // @ts-ignore + // @ts-ignore node = ts.factory.updateExpressionStatement(node, ts.factory.updateCallExpression(node.expression, // @ts-ignore node.expression.expression, node.expression.expression.typeArguments, argumentsArray)) return node; - } else { + } else if(builderParamObjectCollection.get(name) && builderParamObjectCollection.get(name).size < 1) { + log.push({ + type: LogType.ERROR, + message: `'${name}' should have a property decorated with @BuilderParam .`, + pos: node.getStart() + }); + } else if(builderParamObjectCollection.get(name) && builderParamObjectCollection.get(name).size > 1) { log.push({ type: LogType.ERROR, - message: `'${name}' should have a property decorated with @ builderparam .`, + message: `'${name}' only be one property decorated with @BuilderParam .`, pos: node.getStart() }); } diff --git a/compiler/src/process_component_member.ts b/compiler/src/process_component_member.ts index 0052cc917..c3f1020e2 100644 --- a/compiler/src/process_component_member.ts +++ b/compiler/src/process_component_member.ts @@ -421,7 +421,7 @@ function createUpdateParams(name: ts.Identifier, decorator: string): ts.Statemen builderParamObjectCollection.get(componentCollection.currentClassName) .add(name.escapedText.toString()) } - updateParamsNode = createUpdateParamsWithoutIf(name, true); + updateParamsNode = createUpdateParamsWithoutIf(name); break; } return updateParamsNode; @@ -437,7 +437,7 @@ function createUpdateParamsWithIf(name: ts.Identifier): ts.IfStatement { createUpdateParamsWithoutIf(name)], true), undefined); } -function createUpdateParamsWithoutIf(name: ts.Identifier, isAdd: boolean = false): ts.ExpressionStatement { +function createUpdateParamsWithoutIf(name: ts.Identifier): ts.ExpressionStatement { return ts.factory.createExpressionStatement(ts.factory.createBinaryExpression( createPropertyAccessExpressionWithThis(name.getText()), ts.factory.createToken(ts.SyntaxKind.EqualsToken), diff --git a/compiler/src/process_custom_component.ts b/compiler/src/process_custom_component.ts index 5ac3f84b1..4752adb5d 100644 --- a/compiler/src/process_custom_component.ts +++ b/compiler/src/process_custom_component.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ts from 'typescript'; +import ts, { isCallExpression, updateExportAssignment } from 'typescript'; import { COMPONENT_NON_DECORATOR, @@ -72,10 +72,45 @@ const decoractorMap: Map>> = new Map( export function processCustomComponent(node: ts.ExpressionStatement, newStatements: ts.Statement[], log: LogInfo[]): void { if (ts.isCallExpression(node.expression)) { - addCustomComponent(node, newStatements, createCustomComponentNewExpression(node.expression), log); + if (isHasChild(node.expression)) { + // @ts-ignore + let argumentsArray: ts.PropertyAssignment[] = node.expression.arguments[0].properties.slice(); + // @ts-ignore + argumentsArray.forEach((item, index) => { + if(ts.isCallExpression(item.initializer)){ + const PropertyAssignmentNode = ts.factory.createPropertyAssignment( + ts.factory.createIdentifier(item.name.getText()), changeNodeFromCallToArrow(item.initializer)); + argumentsArray.splice(index, 1, PropertyAssignmentNode) + // @ts-ignore + node = ts.factory.updateExpressionStatement(node, ts.factory.updateCallExpression(node.expression, + // @ts-ignore + node.expression.expression, node.expression.expression.typeArguments, + [ts.factory.createObjectLiteralExpression(argumentsArray,true)]) + ); + } + }); + } + addCustomComponent(node, newStatements, createCustomComponentNewExpression(node.expression as + ts.CallExpression), log); } } +function isHasChild(node: ts.CallExpression ): boolean{ + return node.arguments && node.arguments[0] && ts.isObjectLiteralExpression(node.arguments[0]) && + // @ts-ignore + node.arguments[0].properties && node.arguments[0].properties.length > 0; +} + +function changeNodeFromCallToArrow(node: ts.CallExpression): ts.ArrowFunction { + return ts.factory.createArrowFunction(undefined, undefined, [], undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ts.factory.createExpressionStatement(node)], + true + ) + ); +} + function addCustomComponent(node: ts.ExpressionStatement, newStatements: ts.Statement[], newNode: ts.NewExpression, log: LogInfo[]): void { if (ts.isNewExpression(newNode)) { @@ -105,9 +140,12 @@ function validateCustomComponentPrams(node: ts.ExpressionStatement, name: string ts.isObjectLiteralExpression(nodeArguments[0])) { const nodeArgument: ts.ObjectLiteralExpression = nodeArguments[0] as ts.ObjectLiteralExpression; nodeArgument.properties.forEach(item => { + let escapedTextName: string; + // @ts-ignore if (item.name && item.name.escapedText) { // @ts-ignore - curChildProps.add(item.name.escapedText.toString()); + escapedTextName = item.name.escapedText.toString() + curChildProps.add(escapedTextName); } if (isThisProperty(item, propertySet)) { validateStateManagement(item, name, log); -- Gitee