From 88695e4eb6a7fc403f8f300e3e1f3c90a346ee16 Mon Sep 17 00:00:00 2001 From: houhaoyu Date: Mon, 14 Mar 2022 16:11:18 +0800 Subject: [PATCH] fixed 940870a from https://gitee.com/houhaoyu/developtools_ace-ets2bundle/pulls/357 houhaoyu@huawei.com fix 213 Signed-off-by: houhaoyu Change-Id: I6b58022ca18f45297800e38797ee5b135f7ba8ea --- compiler/src/ets_checker.ts | 63 ++++++++++++++++++++++++++++++++++++- compiler/src/pre_define.ts | 1 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/compiler/src/ets_checker.ts b/compiler/src/ets_checker.ts index 21f32f5bf..d6dc1dabe 100644 --- a/compiler/src/ets_checker.ts +++ b/compiler/src/ets_checker.ts @@ -25,9 +25,16 @@ import { import { INNER_COMPONENT_MEMBER_DECORATORS, COMPONENT_IF, - COMPONENT_DECORATORS_PARAMS + COMPONENT_DECORATORS_PARAMS, + COMPONENT_BUILD_FUNCTION, + BIND_POPUP, + CHECKED, + RADIO, + $$ } from './pre_define'; import { JS_BIND_COMPONENTS } from './component_map'; +import { getName } from './process_component_build'; +import { INNER_COMPONENT_NAMES } from './component_map'; function readDeaclareFiles(): string[] { const declarationsFileNames: string[] = []; @@ -183,9 +190,63 @@ function parseAllNode(node: ts.Node, sourceFileNode: ts.SourceFile): void { if (ts.isIfStatement(node)) { appComponentCollection.add(COMPONENT_IF); } + if (ts.isMethodDeclaration(node) && node.name.getText() === COMPONENT_BUILD_FUNCTION) { + if (node.body && node.body.statements && node.body.statements.length) { + const checkProp: ts.NodeArray = node.body.statements; + checkProp.forEach((item, index) => { + traverseBuild(item, index); + }); + } + } node.getChildren().forEach((item: ts.Node) => parseAllNode(item, sourceFileNode)); } +function traverseBuild(node: ts.Node, index: number): void { + if (ts.isExpressionStatement(node)) { + let parentComponentName: string = getName(node); + if (!INNER_COMPONENT_NAMES.has(parentComponentName) && node.parent && node.parent.statements && + index >= 1 && node.parent.statements[index - 1].expression && node.parent.statements[index - 1].expression.expression) { + parentComponentName = node.parent.statements[index - 1].expression.expression.escapedText; + } + node = node.expression; + if (node && node.body && ts.isBlock(node.body)) { + node.body.statements.forEach((item, indexBlock) => { + traverseBuild(item, indexBlock); + }); + } else { + while (node) { + if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) { + const argument = node.arguments; + const propertyName = node.expression.name; + if (propertyName.escapedText === BIND_POPUP || propertyName.escapedText === CHECKED && + parentComponentName === RADIO) { + argument.forEach(item => { + if (item.getText().startsWith($$)) { + while (item.expression) { + item = item.expression; + } + dollarCollection.add(item.getText()); + } + }); + } + } + node = node.expression; + } + } + } else if (ts.isIfStatement(node)) { + if (node.thenStatement && ts.isBlock(node.thenStatement) && node.thenStatement.statements) { + node.thenStatement.statements.forEach((item, indexIfBlock) => { + traverseBuild(item, indexIfBlock); + }); + } + if (node.elseStatement && ts.isBlock(node.elseStatement) && node.elseStatement.statements) { + node.elseStatement.statements.forEach((item, indexElseBlock) => { + traverseBuild(item, indexElseBlock); + }); + } + } +} + function isDecoratorCollection(item: ts.Decorator, decoratorName: string): boolean { return COMPONENT_DECORATORS_PARAMS.has(decoratorName) && // @ts-ignore diff --git a/compiler/src/pre_define.ts b/compiler/src/pre_define.ts index d746eedd0..65f59b23d 100644 --- a/compiler/src/pre_define.ts +++ b/compiler/src/pre_define.ts @@ -200,6 +200,7 @@ export const $$_VALUE: string = 'value'; export const $$_CHANGE_EVENT: string = 'changeEvent'; export const $$_THIS: string = '$$this'; export const $$_NEW_VALUE: string = 'newValue'; +export const $$: string = '$$'; export const INTERFACE_NAME_SUFFIX:string = '_Params'; export const OBSERVED_PROPERTY_ABSTRACT:string = 'ObservedPropertyAbstract'; -- Gitee