diff --git a/compiler/components/xcomponent.json b/compiler/components/xcomponent.json index 624aa8e..1183a99 100644 --- a/compiler/components/xcomponent.json +++ b/compiler/components/xcomponent.json @@ -1,6 +1,5 @@ { "name": "XComponent", - "atomic": true, "attrs": [ "id", "type", "libraryname", "onLoad", "onDestroy" ] diff --git a/compiler/src/process_component_build.ts b/compiler/src/process_component_build.ts index 0c4f37e..c65fb8d 100644 --- a/compiler/src/process_component_build.ts +++ b/compiler/src/process_component_build.ts @@ -94,6 +94,7 @@ import { import { projectConfig } from '../main'; import { transformLog, contextGlobal } from './process_ui_syntax'; import { props } from './compile_info'; +import { CUSTOM_COMPONENT } from '../lib/pre_define'; export function processComponentBuild(node: ts.MethodDeclaration, log: LogInfo[]): ts.MethodDeclaration { @@ -214,7 +215,7 @@ let sourceNode: ts.SourceFile; export function processComponentChild(node: ts.Block | ts.SourceFile, newStatements: ts.Statement[], log: LogInfo[], supplement: supplementType = {isAcceleratePreview: false, line: 0, column: 0, fileName: ''}, - isInnerBuilder: boolean = false): void { + isInnerBuilder: boolean = false, parent: string = undefined): void { if (supplement.isAcceleratePreview) { newsupplement = supplement; const compilerOptions = ts.readConfigFile( @@ -229,11 +230,13 @@ export function processComponentChild(node: ts.Block | ts.SourceFile, newStateme if (ts.isExpressionStatement(item)) { checkEtsComponent(item, log); const name: string = getName(item); - switch (getComponentType(item, log, name)) { + switch (getComponentType(item, log, name, parent)) { case ComponentType.innerComponent: - processInnerComponent(item, newStatements, log); + parent = name; + processInnerComponent(item, newStatements, log, parent); break; case ComponentType.customComponent: + parent = undefined; if (!newsupplement.isAcceleratePreview) { if (item.expression && ts.isEtsComponentExpression(item.expression) && item.expression.body) { const expressionResult: ts.ExpressionStatement = @@ -246,9 +249,11 @@ export function processComponentChild(node: ts.Block | ts.SourceFile, newStateme } break; case ComponentType.forEachComponent: + parent = undefined; processForEachComponent(item, newStatements, log, isInnerBuilder); break; case ComponentType.customBuilderMethod: + parent = undefined; if (INNER_CUSTOM_BUILDER_METHOD.has(name)) { newStatements.push(addInnerBuilderParameter(item)); } else { @@ -256,8 +261,13 @@ export function processComponentChild(node: ts.Block | ts.SourceFile, newStateme } break; case ComponentType.builderParamMethod: + parent = undefined; newStatements.push(addInnerBuilderParameter(item)); break; + case ComponentType.function: + parent = undefined; + newStatements.push(item); + break; } } else if (ts.isIfStatement(item)) { processIfStatement(item, newStatements, log, isInnerBuilder); @@ -360,7 +370,8 @@ function parseEtsComponentExpression(node: ts.ExpressionStatement): EtsComponent return { etsComponentNode: etsComponentNode, hasAttr: hasAttr }; } -function processInnerComponent(node: ts.ExpressionStatement, newStatements: ts.Statement[], log: LogInfo[]): void { +function processInnerComponent(node: ts.ExpressionStatement, newStatements: ts.Statement[], + log: LogInfo[], parent: string = undefined): void { const res: CreateResult = createComponent(node, COMPONENT_CREATE_FUNCTION); newStatements.push(res.newNode); const nameResult: NameResult = { name: null }; @@ -408,7 +419,8 @@ function processInnerComponent(node: ts.ExpressionStatement, newStatements: ts.S if (etsComponentResult.hasAttr) { bindComponentAttr(node, res.identifierNode, newStatements, log); } - processComponentChild(etsComponentResult.etsComponentNode.body, newStatements, log); + processComponentChild(etsComponentResult.etsComponentNode.body, newStatements, log, + {isAcceleratePreview: false, line: 0, column: 0, fileName: ''}, false, parent); } else { bindComponentAttr(node, res.identifierNode, newStatements, log); } @@ -1288,7 +1300,8 @@ enum ComponentType { customComponent, forEachComponent, customBuilderMethod, - builderParamMethod + builderParamMethod, + function } function isEtsComponent(node: ts.ExpressionStatement): boolean { @@ -1304,7 +1317,7 @@ function isEtsComponent(node: ts.ExpressionStatement): boolean { } function getComponentType(node: ts.ExpressionStatement, log: LogInfo[], - name: string): ComponentType { + name: string, parent: string): ComponentType { if (isEtsComponent(node)) { if (componentCollection.customComponents.has(name)) { return ComponentType.customComponent; @@ -1320,6 +1333,9 @@ function getComponentType(node: ts.ExpressionStatement, log: LogInfo[], } else if (builderParamObjectCollection.get(componentCollection.currentClassName) && builderParamObjectCollection.get(componentCollection.currentClassName).has(name)) { return ComponentType.builderParamMethod; + } else if (parent === 'Column' || parent === 'XComponent' && ts.isCallExpression(node.expression) && + ts.isIdentifier(node.expression.expression)) { + return ComponentType.function; } else if (!isAttributeNode(node)) { log.push({ type: LogType.ERROR,