diff --git a/compiler/src/process_component_class.ts b/compiler/src/process_component_class.ts index afec119090663210c7f96b7a37ba15e40bf7b7c5..1d6ddcd6617241dc9a18f8d089e526d1786470fd 100644 --- a/compiler/src/process_component_class.ts +++ b/compiler/src/process_component_class.ts @@ -210,9 +210,11 @@ function processBuildMember(node: ts.MethodDeclaration, context: ts.Transformati }); } const buildNode: ts.MethodDeclaration = processComponentBuild(node, log); - const firstParseBuildNode = ts.visitNode(buildNode, visitBuild); - return ts.visitNode(firstParseBuildNode, visitBuildSecond); + return ts.visitNode(buildNode, visitBuild); function visitBuild(node: ts.Node): ts.Node { + if (isCustomComponentNode(node)) { + return node; + } if (isGeometryView(node)) { node = processGeometryView(node as ts.ExpressionStatement, log); } @@ -227,34 +229,38 @@ function processBuildMember(node: ts.MethodDeclaration, context: ts.Transformati ts.factory.createIdentifier(FOREACH_OBSERVED_OBJECT), ts.factory.createIdentifier(FOREACH_GET_RAW_OBJECT)), undefined, [node]); } - return ts.visitEachChild(node, visitBuild, context); - } - function visitBuildSecond(node: ts.Node): ts.Node { - if (isCustomComponentNode(node) || isCustomBuilderNode(node)) { - return node; + if (ts.isCallExpression(node) && node.expression && (ts.isIdentifier(node.expression) || + ts.isPropertyAccessExpression(node.expression)) && validateBuilderFunctionNode(node.expression)) { + return getParsedBuilderAttrArgumentWithParams(node); } if ((ts.isIdentifier(node) || ts.isPropertyAccessExpression(node)) && - validateBuilderFunctionNode(node)) { + validateBuilderFunctionNode(node) && !validateBuilderParentNode(node)) { return getParsedBuilderAttrArgument(node); } - return ts.visitEachChild(node, visitBuildSecond, context); + return ts.visitEachChild(node, visitBuild, context); } } function validateBuilderFunctionNode(node: ts.PropertyAccessExpression | ts.Identifier): boolean { - if (((ts.isPropertyAccessExpression(node) && node.expression && node.name && + if ((ts.isPropertyAccessExpression(node) && node.expression && node.name && node.expression.kind === ts.SyntaxKind.ThisKeyword && ts.isIdentifier(node.name) && CUSTOM_BUILDER_METHOD.has(node.name.escapedText.toString())) || - ts.isIdentifier(node) && CUSTOM_BUILDER_METHOD.has(node.escapedText.toString())) && - !((ts.isPropertyAccessExpression(node) && validateBuilderParam(node)) || - (ts.isIdentifier(node) && node.parent && ts.isPropertyAccessExpression(node.parent) && - validateBuilderParam(node.parent)))) { + ts.isIdentifier(node) && CUSTOM_BUILDER_METHOD.has(node.escapedText.toString())) { return true; } else { return false; } } +function validateBuilderParentNode(node: ts.PropertyAccessExpression | ts.Identifier): boolean { + if ((ts.isPropertyAccessExpression(node) && validateBuilderParam(node)) || + (ts.isIdentifier(node) && node.parent && ts.isPropertyAccessExpression(node.parent) && + validateBuilderParam(node.parent))) { + return true; + } + return false; +} + function validateBuilderParam(node: ts.PropertyAccessExpression): boolean { if (node.parent && ts.isCallExpression(node.parent) && node.parent.expression === node) { return true; @@ -291,6 +297,26 @@ function getParsedBuilderAttrArgument(node: ts.PropertyAccessExpression | ts.Ide return newObjectNode; } +function getParsedBuilderAttrArgumentWithParams(node: ts.CallExpression): + ts.ObjectLiteralExpression { + return ts.factory.createObjectLiteralExpression([ + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier(BUILDER_ATTR_NAME), + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ts.factory.createExpressionStatement(node)], + true + ) + ) + ) + ]); +} + function isCustomComponentNode(node:ts.NewExpression | ts.ExpressionStatement): boolean { if ((ts.isNewExpression(node) && ts.isIdentifier(node.expression) && node.expression.escapedText && componentCollection.customComponents.has(node.expression.escapedText.toString())) || @@ -302,19 +328,11 @@ function isCustomComponentNode(node:ts.NewExpression | ts.ExpressionStatement): node.expression.expression.expression.escapedText.toString().startsWith( CUSTOM_COMPONENT_EARLIER_CREATE_CHILD))) { return true; - } else { + }else { return false; } } -function isCustomBuilderNode(node: ts.ExpressionStatement): boolean { - return ts.isExpressionStatement(node) && node.expression && - // @ts-ignore - node.expression.expression && node.expression.expression.escapedText && - // @ts-ignore - CUSTOM_BUILDER_METHOD.has(node.expression.expression.escapedText.toString()); -} - function isGeometryView(node: ts.Node): boolean { if (ts.isExpressionStatement(node) && ts.isCallExpression(node.expression)) { const call: ts.CallExpression = node.expression;