diff --git a/BUILD.gn b/BUILD.gn index cfdb952bb80385f9dda9a72864932effb9b58536..96890290ebf750d48d7b7feb01a6b5c5e0418e38 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -147,10 +147,8 @@ ets_loader_sources = [ ohos_copy("ets_loader") { deps = [ ":build_ets_loader_library" ] sources = ets_loader_sources - if (!is_standard_system) { - deps += [ ":build_ets_sysResource" ] - sources += [ ets_sysResource ] - } + deps += [ ":build_ets_sysResource" ] + sources += [ ets_sysResource ] outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ] module_source_dir = target_out_dir + "/$target_name" @@ -198,10 +196,8 @@ ohos_copy("ets_loader_declaration") { ohos_copy("ets_loader_ark") { deps = [ ":build_ets_loader_library" ] sources = ets_loader_sources - if (!is_standard_system) { - deps += [ ":build_ets_sysResource" ] - sources += [ ets_sysResource ] - } + deps += [ ":build_ets_sysResource" ] + sources += [ ets_sysResource ] outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ] } diff --git a/compiler/package-lock.json b/compiler/package-lock.json index d0bd049c2a68bf0569fb5059670ac4e6a0ad22b4..5940092f451a0e686a53c139b3de1dd77d3748fb 100644 --- a/compiler/package-lock.json +++ b/compiler/package-lock.json @@ -2121,9 +2121,9 @@ "dev": true }, "deccjsunit": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/deccjsunit/download/deccjsunit-1.0.4.tgz", - "integrity": "sha1-3rxuTBf46KBVtONr81JQnC/KKqQ=" + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/deccjsunit/download/deccjsunit-1.0.6.tgz", + "integrity": "sha512-ksRmhEFv+zayXuwwM3P3/PqizbTXfK8g5nmWfhOgRjmlH8DAE5C3U/cs3e6g6YtvXq5vS6YVS5T/CECZMd7Apg==" }, "deep-eql": { "version": "3.0.1", diff --git a/compiler/package.json b/compiler/package.json index b3b92f1887435a072e4a0479d13b7c7a5e4b1605..15cd82e13bef863d8ac95881e767a490ee236119 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -37,7 +37,7 @@ "dependencies": { "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^8.1.0", - "deccjsunit": "1.0.4", + "deccjsunit": "^1.0.6", "log4js": "^6.3.0", "ts-loader": "^8.0.12", "typescript": "^4.1.3", diff --git a/compiler/src/process_component_class.ts b/compiler/src/process_component_class.ts index e01c8728ae665d66f3eb79f4bb1ebb2113b93cc5..1ac7be84bd02d9f220821ced62445995068a368c 100644 --- a/compiler/src/process_component_class.ts +++ b/compiler/src/process_component_class.ts @@ -23,6 +23,7 @@ import { CREATE_CONSTRUCTOR_PARAMS, COMPONENT_CONSTRUCTOR_UPDATE_PARAMS, COMPONENT_CONSTRUCTOR_DELETE_PARAMS, + COMPONENT_DECORATOR_PREVIEW, CREATE_CONSTRUCTOR_SUBSCRIBER_MANAGER, ABOUT_TO_BE_DELETE_FUNCTION_ID, CREATE_CONSTRUCTOR_GET_FUNCTION, @@ -74,17 +75,29 @@ export function processComponentClass(node: ts.ClassDeclaration, context: ts.Tra log: LogInfo[], program: ts.Program): ts.ClassDeclaration { validateInheritClass(node, log); const memberNode: ts.ClassElement[] = - processMembers(node.members, node.name, context, log, program); + processMembers(node.members, node.name, context, log, program, checkPreview(node)); return ts.factory.updateClassDeclaration(node, undefined, node.modifiers, node.name, node.typeParameters, updateHeritageClauses(node), memberNode); } +function checkPreview(node: ts.ClassDeclaration) { + let hasPreview: boolean = false; + for (let i = 0; i < node.decorators.length; i++) { + const name: string = node.decorators[i].getText().replace(/\((.|\n)*\)/, '').trim(); + if (name === COMPONENT_DECORATOR_PREVIEW) { + hasPreview = true; + break; + } + } + return hasPreview; +} + type BuildCount = { count: number; } function processMembers(members: ts.NodeArray, parentComponentName: ts.Identifier, - context: ts.TransformationContext, log: LogInfo[], program: ts.Program): ts.ClassElement[] { + context: ts.TransformationContext, log: LogInfo[], program: ts.Program, hasPreview: boolean): ts.ClassElement[] { const buildCount: BuildCount = { count: 0 }; let ctorNode: any = getInitConstructor(members); const newMembers: ts.ClassElement[] = []; @@ -97,7 +110,7 @@ function processMembers(members: ts.NodeArray, parentComponentN let updateItem: ts.ClassElement; if (ts.isPropertyDeclaration(item)) { const result: UpdateResult = processMemberVariableDecorators(parentComponentName, item, - ctorNode, watchMap, checkController, log, program, context); + ctorNode, watchMap, checkController, log, program, context, hasPreview); if (result.isItemUpdate()) { updateItem = result.getProperity(); } else { @@ -298,7 +311,7 @@ function getGeometryReaderFunctionBlock(node: ts.ArrowFunction | ts.FunctionExpr log: LogInfo[]): ts.Block { let blockNode: ts.Block; if (ts.isBlock(node.body)) { - blockNode = node.body; + blockNode = node.body; } else if (ts.isArrowFunction(node) && ts.isCallExpression(node.body)) { blockNode = ts.factory.createBlock([ts.factory.createExpressionStatement(node.body)]); } diff --git a/compiler/src/process_component_member.ts b/compiler/src/process_component_member.ts index 56fa2a2a5a17d791048e39297fb94bf2cbacce96..4799fe32de464adf07ea3bd0b30c6dcad2c654f9 100644 --- a/compiler/src/process_component_member.ts +++ b/compiler/src/process_component_member.ts @@ -193,7 +193,7 @@ export const curPropMap: Map = new Map(); export function processMemberVariableDecorators(parentName: ts.Identifier, item: ts.PropertyDeclaration, ctorNode: ts.ConstructorDeclaration, watchMap: Map, checkController: ControllerType, log: LogInfo[], program: ts.Program, - context: ts.TransformationContext): UpdateResult { + context: ts.TransformationContext, hasPreview: boolean): UpdateResult { const updateResult: UpdateResult = new UpdateResult(); const name: ts.Identifier = item.name as ts.Identifier; if (!item.decorators || !item.decorators.length) { @@ -201,14 +201,14 @@ export function processMemberVariableDecorators(parentName: ts.Identifier, updateResult.setProperity(undefined); updateResult.setUpdateParams(createUpdateParams(name, COMPONENT_NON_DECORATOR)); updateResult.setCtor(updateConstructor(ctorNode, [], [ - createVariableInitStatement(item, COMPONENT_NON_DECORATOR, log, program, context)])); + createVariableInitStatement(item, COMPONENT_NON_DECORATOR, log, program, context, hasPreview)])); updateResult.setControllerSet(createControllerSet(item, parentName, name, checkController)); } else if (!item.type) { validatePropertyNonType(name, log); return updateResult; } else { processPropertyNodeDecorator(parentName, item, updateResult, ctorNode, name, watchMap, - log, program, context); + log, program, context, hasPreview); } return updateResult; } @@ -234,7 +234,7 @@ function createControllerSet(node: ts.PropertyDeclaration, componentName: ts.Ide function processPropertyNodeDecorator(parentName: ts.Identifier, node: ts.PropertyDeclaration, updateResult: UpdateResult, ctorNode: ts.ConstructorDeclaration, name: ts.Identifier, watchMap: Map, log: LogInfo[], program: ts.Program, - context: ts.TransformationContext): void { + context: ts.TransformationContext, hasPreview: boolean): void { let stateManagementDecoratorCount: number = 0; for (let i = 0; i < node.decorators.length; i++) { const decoratorName: string = node.decorators[i].getText().replace(/\(.*\)$/, '').trim(); @@ -271,7 +271,7 @@ function processPropertyNodeDecorator(parentName: ts.Identifier, node: ts.Proper processWatch(node, node.decorators[i], watchMap, log); } else if (INNER_COMPONENT_MEMBER_DECORATORS.has(decoratorName)) { stateManagementDecoratorCount += 1; - processStateDecorators(node, decoratorName, updateResult, ctorNode, log, program, context); + processStateDecorators(node, decoratorName, updateResult, ctorNode, log, program, context, hasPreview); } } if (stateManagementDecoratorCount > 1) { @@ -282,12 +282,12 @@ function processPropertyNodeDecorator(parentName: ts.Identifier, node: ts.Proper function processStateDecorators(node: ts.PropertyDeclaration, decorator: string, updateResult: UpdateResult, ctorNode: ts.ConstructorDeclaration, log: LogInfo[], - program: ts.Program, context: ts.TransformationContext): void { + program: ts.Program, context: ts.TransformationContext, hasPreview:boolean): void { const name: ts.Identifier = node.name as ts.Identifier; updateResult.setProperity(undefined); const updateState: ts.Statement[] = []; const variableInitStatement: ts.Statement = - createVariableInitStatement(node, decorator, log, program, context); + createVariableInitStatement(node, decorator, log, program, context, hasPreview); if (variableInitStatement) { updateState.push(variableInitStatement); } @@ -338,7 +338,8 @@ function processWatch(node: ts.PropertyDeclaration, decorator: ts.Decorator, } function createVariableInitStatement(node: ts.PropertyDeclaration, decorator: string, - log: LogInfo[], program: ts.Program, context: ts.TransformationContext): ts.Statement { + log: LogInfo[], program: ts.Program, context: ts.TransformationContext, hasPreview: boolean): + ts.Statement { const name: ts.Identifier = node.name as ts.Identifier; let type: ts.TypeNode; let updateState: ts.ExpressionStatement; @@ -354,9 +355,11 @@ function createVariableInitStatement(node: ts.PropertyDeclaration, decorator: st updateState = updateObservedProperty(node, name, type, program); break; case COMPONENT_LINK_DECORATOR: + wrongDecoratorInPreview(node, COMPONENT_LINK_DECORATOR, hasPreview, log); updateState = updateSynchedPropertyTwoWay(name, type, program); break; case COMPONENT_PROP_DECORATOR: + wrongDecoratorInPreview(node, COMPONENT_PROP_DECORATOR, hasPreview, log); updateState = updateSynchedPropertyOneWay(name, type, decorator, log, program); break; case COMPONENT_STORAGE_PROP_DECORATOR: @@ -369,12 +372,25 @@ function createVariableInitStatement(node: ts.PropertyDeclaration, decorator: st updateState = updateSynchedPropertyNesedObject(name, type, decorator, log); break; case COMPONENT_CONSUME_DECORATOR: + wrongDecoratorInPreview(node, COMPONENT_CONSUME_DECORATOR, hasPreview, log); updateState = updateConsumeProperty(node, name); break; } return updateState; } +function wrongDecoratorInPreview(node: ts.PropertyDeclaration, decorator: string, + hasPreview: boolean, log: LogInfo[]) { + if (hasPreview) { + log.push({ + type: LogType.WARN, + message: `The variable with ${decorator} in component with @Preview may ` + + `cause error in component preview mode`, + pos: node.getStart() + }); + } +} + function createUpdateParams(name: ts.Identifier, decorator: string): ts.Statement { let updateParamsNode: ts.Statement; switch (decorator) { diff --git a/compiler/test/pages/ExportComponent.ets b/compiler/test/pages/ExportComponent.ets index d3d65b4253d9265bbc82b4acc6533ca4df606039..8a3f99cfcaba6d6161bbd965adf48d7dd913b9e2 100644 --- a/compiler/test/pages/ExportComponent.ets +++ b/compiler/test/pages/ExportComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import DefaultComponent from "./test/pages/DefaultComponent.ets" +import DefaultComponent from "./DefaultComponent.ets" @Component struct ExportComponent1 { diff --git a/compiler/test/pages/ExportStarComponent.ets b/compiler/test/pages/ExportStarComponent.ets index 164a1cc91ef9db08bbff5ff4e596d7ee3ca79fbe..aabfcd9ae18331766ca86f44c67424572d861b6d 100644 --- a/compiler/test/pages/ExportStarComponent.ets +++ b/compiler/test/pages/ExportStarComponent.ets @@ -13,4 +13,4 @@ * limitations under the License. */ -export * as AllStarComponent from './test/pages/ExportComponent'; +export * as AllStarComponent from './ExportComponent'; diff --git a/compiler/test/ut/decorator/builder.ts b/compiler/test/ut/decorator/builder.ts index 9b8c506fb8426783572633dae611ca4e178ac1f1..bbdef6dafe25ffbb6581daee9b2d488b58d4ceae 100644 --- a/compiler/test/ut/decorator/builder.ts +++ b/compiler/test/ut/decorator/builder.ts @@ -14,73 +14,135 @@ */ exports.source = ` -@Builder -function SquareText(label: string, size: number) { - Text(label) - .width(1 * size).height(1 * size) -} - -@Builder -function bb() { - Text("label") -} - @Entry @Component -struct HomeComponent { - size = 1 +struct CompA { + size: number = 100; + @State customPopupArrow: boolean = false + @Builder SquareText(label: string){ + Text(label) + .width(1 * this.size) + .height(1 * this.size) + } +@Builder RowOfSquareTexts (label1: string, label2: string){ + Row(){ + this.SquareText(label1) + this.SquareText(label2) + } + .width(1 * this.size) + .height(1 * this.size) +} - @Builder aa(label: string) { - Text(label) +@Builder popupBuilder() { + Flex({direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItem: ItemAlign.Center}){ + Text('Content of CustomPopup') + .fontSize(20) } + .width(100) + .height(50) +} - build() { - Column() { - bb() - SquareText("A", this.size) - this.aa("A") + build(){ + Column(){ + Row(){ + this.SquareText("A") + this.SquareText("B") + } + .width(2 * this.size) + .height(1 * this.size) + .bindPopup(this.customPopupArrow, { + builder: this.popupBuilder, + placement: Placement.Bottom, + maskColor: 0x01000000, + popupColor: Color.Red, + enableArrow: true, + onStateChange: (e) => { + if(!e.isVisible){ + this.customPopupArrow = false + } + } + }) + this.RowOfSquareTexts("C", "D") } - .height(500) + .width(2 * this.size) + .height(2 * this.size) } }` exports.expectResult = -`function SquareText(label, size) { - Text.create(label); - Text.width(1 * size); - Text.height(1 * size); - Text.pop(); -} -function bb() { - Text.create("label"); - Text.pop(); -} -class HomeComponent extends View { +`class CompA extends View { constructor(compilerAssignedUniqueChildId, parent, params) { super(compilerAssignedUniqueChildId, parent); - this.size = 1; + this.size = 100; + this.__customPopupArrow = new ObservedPropertySimple(false, this, "customPopupArrow"); this.updateWithValueParams(params); } updateWithValueParams(params) { if (params.size !== undefined) { this.size = params.size; } + if (params.customPopupArrow !== undefined) { + this.customPopupArrow = params.customPopupArrow; + } } aboutToBeDeleted() { + this.__customPopupArrow.aboutToBeDeleted(); SubscriberManager.Get().delete(this.id()); } - aa(label) { + get customPopupArrow() { + return this.__customPopupArrow.get(); + } + set customPopupArrow(newValue) { + this.__customPopupArrow.set(newValue); + } + SquareText(label) { Text.create(label); + Text.width(1 * this.size); + Text.height(1 * this.size); + Text.pop(); + } + RowOfSquareTexts(label1, label2) { + Row.create(); + Row.width(1 * this.size); + Row.height(1 * this.size); + this.SquareText(label1); + this.SquareText(label2); + Row.pop(); + } + popupBuilder() { + Flex.create({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItem: ItemAlign.Center }); + Flex.width(100); + Flex.height(50); + Text.create('Content of CustomPopup'); + Text.fontSize(20); Text.pop(); + Flex.pop(); } render() { Column.create(); - Column.height(500); - bb(); - SquareText("A", this.size); - this.aa("A"); + Column.width(2 * this.size); + Column.height(2 * this.size); + Row.create(); + Row.width(2 * this.size); + Row.height(1 * this.size); + Row.bindPopup(this.customPopupArrow, { + builder: { builder: this.popupBuilder.bind(this) }, + placement: Placement.Bottom, + maskColor: 0x01000000, + popupColor: Color.Red, + enableArrow: true, + onStateChange: (e) => { + if (!e.isVisible) { + this.customPopupArrow = false; + } + } + }); + this.SquareText("A"); + this.SquareText("B"); + Row.pop(); + this.RowOfSquareTexts("C", "D"); Column.pop(); } } -loadDocument(new HomeComponent("1", undefined, {})); +loadDocument(new CompA("1", undefined, {})); ` diff --git a/generateSysResource.py b/generateSysResource.py old mode 100644 new mode 100755 index d678a2a83f9cb1fa168d26c9fb3b3a182dac862b..3bc1e49efb586ff710e604816cfaef8eb2424310 --- a/generateSysResource.py +++ b/generateSysResource.py @@ -41,7 +41,7 @@ class SysResource: continue item_name = item["name"] - item_id = item["order"] + 0x7000000 + item_id = item["order"] + 0x7800000 if item_type not in self.records: self.records[item_type] = dict() self.records[item_type][item_name] = item_id