From 2877726936945cd14b422eec056955596b7bcf54 Mon Sep 17 00:00:00 2001 From: xieziang Date: Tue, 24 Jun 2025 15:12:00 +0800 Subject: [PATCH 1/2] add koala mirror Signed-off-by: xieziang Change-Id: I4497679c53b266c975cc38df3095d0d8847631b3 --- arkui-plugins/custom-import-plugin.js | 18 ++++++ arkui-plugins/package.json | 3 +- arkui-plugins/path.ts | 4 ++ koala-wrapper/BUILD.gn | 4 ++ koala-wrapper/build_ts_wrapper.py | 81 ++++++++++++++++++++++++--- koala-wrapper/mirror/package.json | 56 ++++++++++++++++++ 6 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 koala-wrapper/mirror/package.json diff --git a/arkui-plugins/custom-import-plugin.js b/arkui-plugins/custom-import-plugin.js index 84b8a6bd5..13bda857c 100644 --- a/arkui-plugins/custom-import-plugin.js +++ b/arkui-plugins/custom-import-plugin.js @@ -40,6 +40,24 @@ module.exports = function (babel) { t.variableDeclarator(t.identifier('arkts'), requireCall) ]); + pathNode.replaceWithMultiple([newImport, arkts]); + } + if (sourceValue === '@koalaui/libarkts-mirror' && pathNode.node.specifiers.length === 1 && t.isImportNamespaceSpecifier(pathNode.node.specifiers[0])) { + const currentFileDir = path.dirname(pathNode.hub.file.opts.filename); + const configDir = process.cwd(); + const relativePath = path.relative(currentFileDir, configDir); + const importPath = relativePath ? path.join(relativePath, 'path') : './path'; + + const newImport = t.importDeclaration( + [t.importSpecifier(t.identifier('getArktsMirrorPath'), t.identifier('getArktsMirrorPath'))], + t.stringLiteral(importPath) + ); + + const requireCall = t.callExpression(t.identifier('require'), [t.callExpression(t.identifier('getArktsMirrorPath'), [])]); + const arkts = t.variableDeclaration('const', [ + t.variableDeclarator(t.identifier('mirrorArkts'), requireCall) + ]); + pathNode.replaceWithMultiple([newImport, arkts]); } } diff --git a/arkui-plugins/package.json b/arkui-plugins/package.json index 75420af81..d395ff842 100644 --- a/arkui-plugins/package.json +++ b/arkui-plugins/package.json @@ -31,6 +31,7 @@ "typescript": "^5.0.0" }, "dependencies": { - "@koalaui/libarkts": "../koala-wrapper" + "@koalaui/libarkts": "../koala-wrapper", + "@koalaui/libarkts-mirror": "../koala-wrapper/mirror" } } diff --git a/arkui-plugins/path.ts b/arkui-plugins/path.ts index a8646fcbf..d3f82da3f 100644 --- a/arkui-plugins/path.ts +++ b/arkui-plugins/path.ts @@ -59,3 +59,7 @@ export function getCommonPath() { export function getCompatPath() { return path.join(findRootDir(), 'koala-wrapper/koalaui/compat', './dist/src/index.js'); } + +export function getArktsMirrorPath() { + return path.join(findRootDir(), 'koala-wrapper/mirror', './build/arkts-api/index.js'); +} \ No newline at end of file diff --git a/koala-wrapper/BUILD.gn b/koala-wrapper/BUILD.gn index 58807818d..6f56b0623 100644 --- a/koala-wrapper/BUILD.gn +++ b/koala-wrapper/BUILD.gn @@ -15,10 +15,12 @@ import("//build/ohos.gni") import("//build/config/components/ets_frontend/ets2abc_config.gni") npm_path = "//prebuilts/build-tools/common/nodejs/current/bin/npm" +mirror_ui2abc_dir = "//foundation/arkui/ace_engine/frameworks/bridge/arkts_frontend/koala_mirror/ui2abc" action("gen_sdk_ts_wrapper") { script = "build_ts_wrapper.py" deps = [ "./native:es2panda" ] + external_deps = [ "ace_engine:es2panda" ] args = [ "--source_path", rebase_path(get_path_info(".", "abspath")), @@ -30,6 +32,8 @@ action("gen_sdk_ts_wrapper") { "$current_os", "--root_out_dir", rebase_path(root_out_dir), + "--mirror_ui2abc_dir", + rebase_path(mirror_ui2abc_dir) ] outputs = [ "$target_gen_dir" ] diff --git a/koala-wrapper/build_ts_wrapper.py b/koala-wrapper/build_ts_wrapper.py index 178f8772f..fb98cf6b8 100755 --- a/koala-wrapper/build_ts_wrapper.py +++ b/koala-wrapper/build_ts_wrapper.py @@ -18,17 +18,28 @@ import os import shutil import subprocess import sys -import tarfile - - -def copy_files(source_path, dest_path, is_file=False): +from pathlib import Path +import re + +def process_mirror_output(root_path): + root = Path(root_path) + js_files = [file for file in root.rglob('*.js') if file.is_file()] + for file in js_files: + content = file.read_text(encoding='utf-8') + new_content = re.sub(r'require\("@koalaui/(\w+?)"\)', r'require("#koalaui/\1")', content) + new_content = re.sub(r'require\("@common/(\w+?)"\)', r'require("#common/\1")', new_content) + new_content = re.sub(r'require\("@platform/(\w+?)"\)', r'require("#platform/\1")', new_content) + if new_content != content: + file.write_text(new_content, encoding='utf-8') + +def copy_files(source_path, dest_path, is_file=False, ignore_func=None): try: if is_file: os.makedirs(os.path.dirname(dest_path), exist_ok=True) shutil.copy(source_path, dest_path) else: shutil.copytree(source_path, dest_path, dirs_exist_ok=True, - symlinks=True) + symlinks=True, ignore=ignore_func) except Exception as err: raise Exception("Copy files failed. Error: " + str(err)) from err @@ -49,6 +60,28 @@ def build(options): def copy_output(options): + run_cmd(['rm', '-rf', os.path.join(options.source_path, 'mirror/build')]) + # only keep .d.ts files + def copy_to_source_ignore_func(dirname, filenames): + return [f for f in filenames + if os.path.isfile(os.path.join(dirname, f)) and not f.endswith('.d.ts')] + + copy_files(os.path.join(options.mirror_ui2abc_dir, 'libarkts/build'), + os.path.join(options.source_path, 'mirror/build'), + ignore_func=copy_to_source_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../incremental/common/build'), + os.path.join(options.source_path, 'mirror/build/koalaui/common/dist'), + ignore_func=copy_to_source_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../incremental/compat/build'), + os.path.join(options.source_path, 'mirror/build/koalaui/compat/dist'), + ignore_func=copy_to_source_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../interop/build/'), + os.path.join(options.source_path, 'mirror/build/koalaui/interop/dist'), + ignore_func=copy_to_source_ignore_func) + run_cmd(['rm', '-rf', options.output_path]) copy_files(os.path.join(options.source_path, 'build/lib'), os.path.join(options.output_path, 'build/lib')) @@ -59,17 +92,46 @@ def copy_output(options): copy_files(os.path.join(options.source_path, 'package.json'), os.path.join(options.output_path, 'package.json'), True) + # only keep JS files + def copy_to_out_ignore_func(dirname, filenames): + return [f for f in filenames + if os.path.isfile(os.path.join(dirname, f)) and not f.endswith('.js')] + + copy_files(os.path.join(options.mirror_ui2abc_dir, 'libarkts/build'), + os.path.join(options.output_path, 'mirror/build'), + ignore_func=copy_to_out_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../incremental/common/build'), + os.path.join(options.output_path, 'mirror/build/koalaui/common/dist'), + ignore_func=copy_to_out_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../incremental/compat/build'), + os.path.join(options.output_path, 'mirror/build/koalaui/compat/dist'), + ignore_func=copy_to_out_ignore_func) + + copy_files(os.path.join(options.mirror_ui2abc_dir, '../interop/build/'), + os.path.join(options.output_path, 'mirror/build/koalaui/interop/dist'), + ignore_func=copy_to_out_ignore_func) + + copy_files(os.path.join(options.source_path, 'mirror/package.json'), + os.path.join(options.output_path, 'mirror/package.json'), True) + + # replace package imports with alias imports + process_mirror_output(os.path.join(options.output_path, 'mirror/build')) + if options.current_os == "mingw" : copy_files(os.path.join(options.root_out_dir, 'libes2panda.dll'), os.path.join(options.output_path, 'build/native/es2panda.node'), True) - copy_files(os.path.join(options.root_out_dir, 'libes2panda.dll'), - os.path.join(options.source_path, 'build/native/es2panda.node'), True) + + copy_files(os.path.join(options.root_out_dir, 'libes2panda_lib.dll'), + os.path.join(options.output_path, 'mirror/build/native/build/es2panda.node'), True) if options.current_os == "linux" or options.current_os == "mac" : copy_files(os.path.join(options.root_out_dir, 'libes2panda.node'), os.path.join(options.output_path, 'build/native/es2panda.node'), True) - copy_files(os.path.join(options.root_out_dir, 'libes2panda.node'), - os.path.join(options.source_path, 'build/native/es2panda.node'), True) + + copy_files(os.path.join(options.root_out_dir, 'libes2panda_lib.node'), + os.path.join(options.output_path, 'mirror/build/native/build/es2panda.node'), True) def parse_args(): @@ -79,6 +141,7 @@ def parse_args(): parser.add_argument('--output_path', help='path to output') parser.add_argument('--root_out_dir', help='path to root out') parser.add_argument('--current_os', help='current_os') + parser.add_argument('--mirror_ui2abc_dir', help='mirror_ui2abc_dir') options = parser.parse_args() return options diff --git a/koala-wrapper/mirror/package.json b/koala-wrapper/mirror/package.json new file mode 100644 index 000000000..2942a72a8 --- /dev/null +++ b/koala-wrapper/mirror/package.json @@ -0,0 +1,56 @@ +{ + "name": "@koalaui/libarkts-mirror", + "version": "1.0.0", + "private": true, + "main": "./build/index.js", + "types": "./build/arkts-api/index.d.ts", + "exports": { + ".": "./build/arkts-api/index.js", + "./build/lib/es2panda": "./build/index.js" + }, + "files": [ + "./build/*" + ], + "config": { + "gen_version": "3.0.19" + }, + "devDependencies": { + "@babel/cli": "7.20.7", + "@babel/core": "7.20.12", + "@babel/plugin-proposal-class-properties": "7.18.6", + "@babel/preset-env": "7.20.2", + "@babel/preset-typescript": "7.18.6", + "@babel/runtime": "7.20.13", + "@tsconfig/recommended": "1.0.8", + "node-addon-api": "^8.3.0", + "typescript": "^5.0.0", + "@types/node": "^18.0.0" + }, + "imports": { + "#koalaui/interop": { + "default": "./build/koalaui/interop/dist/lib/src/interop/index.js" + }, + "#koalaui/common": { + "default": "./build/koalaui/common/dist/lib/src/index.js" + }, + "#koalaui/compat": { + "default": "./build/koalaui/compat/dist/src/index.js" + }, + "#common/wrappers": { + "browser": "./build/koalaui/interop/dist/lib/src/wasm/wrappers/index.js", + "node": "./build/koalaui/interop/dist/lib/src/napi/wrappers/index.js" + }, + "#common/wrappers/*": { + "browser": "./build/koalaui/interop/dist/lib/src/wasm/wrappers/*.js", + "node": "./build/koalaui/interop/dist/lib/src/napi/wrappers/*.js", + "default": "./build/koalaui/interop/dist/lib/src/napi/wrappers/*.js" + }, + "#platform": { + "ark": "./build/koalaui/compat/dist/src/ohos/index.js", + "ios": "./build/koalaui/compat/dist/src/typescript/index.js", + "browser": "./build/koalaui/compat/dist/src/typescript/index.js", + "node": "./build/koalaui/compat/dist/src/typescript/index.js", + "default": "./build/koalaui/compat/dist/src/typescript/index.js" + } + } +} -- Gitee From 9093a7ea1483f20d827ef24ea80d9982ca8414e5 Mon Sep 17 00:00:00 2001 From: xieziang Date: Fri, 27 Jun 2025 14:38:42 +0800 Subject: [PATCH 2/2] debug Change-Id: Iafdd25f9e027ab49ab6cf4cded9416fb0766acf6 --- arkui-plugins/common/debug.ts | 2 +- arkui-plugins/common/program-visitor.ts | 6 +- .../interop-plugins/decl_transformer.ts | 97 +++++++++++-------- .../interop-plugins/emit_transformer.ts | 15 +-- arkui-plugins/interop-plugins/index.ts | 41 +++++--- .../entry/src/main/ets/pages/new.ts | 6 ++ .../entry/src/main/ets/pages/new.d.ets | 0 .../demo/localtest/build_decl_config.json | 23 +++++ .../localtest/build_decl_config_template.json | 2 +- arkui-plugins/ui-plugins/index.ts | 2 +- koala-wrapper/src/Es2pandaEnums.ts | 4 +- 11 files changed, 132 insertions(+), 66 deletions(-) create mode 100644 arkui-plugins/test/demo/hello_world/declgenBridgeCodePath/entry/src/main/ets/pages/new.ts create mode 100644 arkui-plugins/test/demo/hello_world/declgenV1OutPath/entry/src/main/ets/pages/new.d.ets create mode 100644 arkui-plugins/test/demo/localtest/build_decl_config.json diff --git a/arkui-plugins/common/debug.ts b/arkui-plugins/common/debug.ts index 467572560..b437bf3b3 100644 --- a/arkui-plugins/common/debug.ts +++ b/arkui-plugins/common/debug.ts @@ -16,7 +16,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as arkts from '@koalaui/libarkts'; -const isDebugLog: boolean = false; +const isDebugLog: boolean = true; const isDebugDump: boolean = false; const isPerformance: boolean = false; const enableMemoryTracker: boolean = false; diff --git a/arkui-plugins/common/program-visitor.ts b/arkui-plugins/common/program-visitor.ts index 55ac1aad4..848776fc6 100644 --- a/arkui-plugins/common/program-visitor.ts +++ b/arkui-plugins/common/program-visitor.ts @@ -199,11 +199,13 @@ export class ProgramVisitor extends AbstractVisitor { } programVisitor(program: arkts.Program): arkts.Program { + console.log('+++++++++++++++++++++++++++1') this.visitExternalSources(program, [program]); - + console.log('+++++++++++++++++++++++++++1') let programScript = program.astNode; + console.log('+++++++++++++++++++++++++++1') programScript = this.visitor(programScript, program, this.externalSourceName); - + console.log('+++++++++++++++++++++++++++1') const visitorsToReset = flattenVisitorsInHooks(this.hooks, this.state); visitorsToReset.forEach((visitor) => visitor.reset()); diff --git a/arkui-plugins/interop-plugins/decl_transformer.ts b/arkui-plugins/interop-plugins/decl_transformer.ts index 58d5a6a6d..191497c96 100644 --- a/arkui-plugins/interop-plugins/decl_transformer.ts +++ b/arkui-plugins/interop-plugins/decl_transformer.ts @@ -14,25 +14,27 @@ */ import * as arkts from '@koalaui/libarkts'; +import * as mirrorArkts from '@koalaui/libarkts-mirror'; import { AbstractVisitor } from '../common/abstract-visitor'; import { ARKUI_DECLARE_LIST } from './arkuiImportList'; import { debugLog } from '../common/debug'; +import { ArkTSConfigContext } from 'test/utils/shared-types'; export class DeclTransformer extends AbstractVisitor { constructor(private options?: interop.DeclTransformerOptions) { super(); } - processComponent(node: arkts.StructDeclaration): arkts.ClassDeclaration { + processComponent(node: mirrorArkts.ETSStructDeclaration): mirrorArkts.ClassDeclaration { const className = node.definition?.ident?.name; if (!className) { throw 'Non Empty className expected for Component'; } - let newDec: arkts.ClassDeclaration = arkts.factory.createClassDeclaration(node.definition); + let newDec: mirrorArkts.ClassDeclaration = mirrorArkts.factory.createClassDeclaration(node.definition); - const newDefinition = arkts.factory.updateClassDefinition( + const newDefinition = mirrorArkts.factory.updateClassDefinition( newDec.definition!, newDec.definition?.ident, undefined, @@ -42,30 +44,45 @@ export class DeclTransformer extends AbstractVisitor { undefined, node.definition?.body, newDec.definition?.modifiers!, - arkts.classDefinitionFlags(newDec.definition!) | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE + mirrorArkts.classDefinitionFlags(newDec.definition!) | mirrorArkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE ); - arkts.factory.updateClassDeclaration(newDec, newDefinition); + mirrorArkts.factory.updateClassDeclaration(newDec, newDefinition); newDec.modifiers = node.modifiers; return newDec; } - visitor(beforeChildren: arkts.AstNode): arkts.AstNode { - let astNode: arkts.AstNode = beforeChildren; - if (arkts.isEtsScript(astNode)) { + visitor(beforeChildren: mirrorArkts.AstNode): mirrorArkts.AstNode { + let astNode: mirrorArkts.AstNode = beforeChildren; + if (astNode instanceof mirrorArkts.ETSModule) { astNode = this.transformImportDecl(astNode); } const node = this.visitEachChild(astNode); - if (arkts.isStructDeclaration(node)) { - debugLog(`DeclTransformer:before:flag:${arkts.classDefinitionIsFromStructConst(node.definition!)}`); - arkts.classDefinitionSetFromStructModifier(node.definition!); + console.log(node.constructor.name) + console.log(node) + console.log(node.dumpSrc()) + if (node.constructor.name === 'ETSStructDeclaration') { + // if (mirrorArkts.isETSStructDeclaration(node)) { + console.log('ETSStructDeclaration----------') + let node1:arkts.StructDeclaration = new arkts.StructDeclaration(node.peer); + console.log('ETSStructDeclaration---------- node1') + console.log(node1.definition) + debugLog(`DeclTransformer:before:flag:${arkts.classDefinitionIsFromStructConst(node1.definition!)}`); + debugLog(`DeclTransformer:before:flag:${mirrorArkts.classDefinitionIsFromStructConst(node.definition!)}`); + mirrorArkts.classDefinitionSetFromStructModifier(node.definition!); let newnode = this.processComponent(node); - debugLog(`DeclTransformer:after:flag:${arkts.classDefinitionIsFromStructConst(newnode.definition!)}`); + debugLog(`DeclTransformer:after:flag:${mirrorArkts.classDefinitionIsFromStructConst(newnode.definition!)}`); return newnode; - } else if (arkts.isETSImportDeclaration(astNode)) { + } + else if (node.constructor.name === 'ETSImportDeclaration') { + // else if (mirrorArkts.isETSImportDeclaration(astNode)) { + console.log('ETSImportDeclaration----------') return this.updateImportDeclaration(astNode); - } else if (arkts.isMethodDefinition(astNode)) { - if (astNode.name?.name === 'build' ) { + } + else if (node.constructor.name === 'MethodDefinition') { + console.log('MethodDefinition----------') + // else if (mirrorArkts.isMethodDefinition(astNode)) { + if (astNode.id?.name === 'build' ) { return this.transformMethodDefinition(astNode); } return astNode; @@ -73,59 +90,63 @@ export class DeclTransformer extends AbstractVisitor { return node; } - transformImportDecl(astNode: arkts.AstNode):arkts.AstNode { - if (!arkts.isEtsScript(astNode)) { + transformImportDecl(astNode: mirrorArkts.AstNode):mirrorArkts.AstNode { + if (!(astNode instanceof mirrorArkts.ETSModule)) { return astNode; } let statements = astNode.statements.filter(node => this.isImportDeclarationNeedFilter(node)); - return arkts.factory.updateEtsScript(astNode, statements); + return mirrorArkts.updateETSModuleByStatements(astNode, statements); } - transformMethodDefinition(node: arkts.MethodDefinition): arkts.AstNode { - const func: arkts.ScriptFunction = node.scriptFunction; + transformMethodDefinition(node: mirrorArkts.MethodDefinition): mirrorArkts.AstNode { + const func: mirrorArkts.ScriptFunction = node.function!; const isFunctionCall: boolean = false; - const typeNode: arkts.TypeNode | undefined = node.scriptFunction?.returnTypeAnnotation; - const updateFunc = arkts.factory.updateScriptFunction( + const typeNode: mirrorArkts.TypeNode | undefined = node.function?.returnTypeAnnotation; + const updateFunc = mirrorArkts.factory.updateScriptFunction( func, - !!func.body && arkts.isBlockStatement(func.body) - ? arkts.factory.updateBlock( + !!func.body && mirrorArkts.isBlockStatement(func.body) + ? mirrorArkts.factory.updateBlockStatement( func.body, func.body.statements.filter((st) => false) ) : undefined, - arkts.FunctionSignature.createFunctionSignature(func.typeParams, func.params, func.returnTypeAnnotation, false), + func.typeParams, func.params, func.returnTypeAnnotation, false, + // mirrorArkts.FunctionSignature.createFunctionSignature(func.typeParams, func.params, func.returnTypeAnnotation, false), func?.flags, - func?.modifiers + func?.modifiers, + undefined, + undefined ); - return arkts.factory.updateMethodDefinition( + return mirrorArkts.factory.updateMethodDefinition( node, node.kind, - arkts.factory.updateIdentifier( - node.name, - node.name?.name + mirrorArkts.factory.updateIdentifier( + node.id!, + node.id?.name! ), - updateFunc, + updateFunc as mirrorArkts.Expression, node.modifiers, - false + false, + node.overloads ); } - isImportDeclarationNeedFilter(astNode: arkts.AstNode):boolean { - if (!arkts.isETSImportDeclaration(astNode)) { + isImportDeclarationNeedFilter(astNode: mirrorArkts.AstNode):boolean { + if (!mirrorArkts.isETSImportDeclaration(astNode)) { return true; } return astNode?.source?.str !== '@global.arkui'; } - updateImportDeclaration(astNode: arkts.AstNode):arkts.AstNode { - if (!arkts.isETSImportDeclaration(astNode) || astNode?.source?.str !== '@ohos.arkui.component') { + updateImportDeclaration(astNode: mirrorArkts.AstNode):mirrorArkts.AstNode { + if (astNode.constructor.name != 'ETSImportDeclaration' || astNode?.source?.str !== '@ohos.arkui.component') { return astNode; } astNode.specifiers.forEach((element) => { - if (arkts.isImportSpecifier(element)) { + if (mirrorArkts.isImportSpecifier(element)) { if (ARKUI_DECLARE_LIST.has(element.imported?.name as string)) { - arkts.ImportSpecifierSetRemovable(element); + mirrorArkts.ImportSpecifierSetRemovable(element); } } }); diff --git a/arkui-plugins/interop-plugins/emit_transformer.ts b/arkui-plugins/interop-plugins/emit_transformer.ts index d68dfbc2f..55601d9e7 100644 --- a/arkui-plugins/interop-plugins/emit_transformer.ts +++ b/arkui-plugins/interop-plugins/emit_transformer.ts @@ -13,7 +13,8 @@ * limitations under the License. */ -import * as arkts from '@koalaui/libarkts'; +// import * as arkts from '@koalaui/libarkts'; +import * as mirrorArkts from '@koalaui/libarkts-mirror'; import { AbstractVisitor } from '../common/abstract-visitor'; @@ -24,13 +25,13 @@ export class EmitTransformer extends AbstractVisitor { super(); } - processComponent(node: arkts.ClassDeclaration): arkts.ClassDeclaration { + processComponent(node: mirrorArkts.ClassDeclaration): mirrorArkts.ClassDeclaration { const className = node.definition?.ident?.name; if (!className) { throw 'Non Empty className expected for Component'; } - const newDefinition = arkts.factory.updateClassDefinition( + const newDefinition = mirrorArkts.factory.updateClassDefinition( node.definition, node.definition?.ident, undefined, @@ -40,19 +41,19 @@ export class EmitTransformer extends AbstractVisitor { undefined, node.definition?.body, node.definition?.modifiers, - arkts.classDefinitionFlags(node.definition) | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE + mirrorArkts.classDefinitionFlags(node.definition) | mirrorArkts.Es2pandaModifierFlags.MODIFIER_FLAGS_NONE ); - let newDec: arkts.ClassDeclaration = arkts.factory.updateClassDeclaration(node, newDefinition); + let newDec: mirrorArkts.ClassDeclaration = mirrorArkts.factory.updateClassDeclaration(node, newDefinition); debugLog(`DeclTransformer:checked:struct_ast:${newDefinition.dumpJson()}`); newDec.modifiers = node.modifiers; return newDec; } - visitor(beforeChildren: arkts.AstNode): arkts.AstNode { + visitor(beforeChildren: mirrorArkts.AstNode): mirrorArkts.AstNode { const node = this.visitEachChild(beforeChildren); - if (arkts.isClassDeclaration(node) && arkts.classDefinitionIsFromStructConst(node.definition!)) { + if (mirrorArkts.isClassDeclaration(node) && mirrorArkts.classDefinitionIsFromStructConst(node.definition!)) { return this.processComponent(node); } return node; diff --git a/arkui-plugins/interop-plugins/index.ts b/arkui-plugins/interop-plugins/index.ts index 21c971ce0..f35e11b93 100644 --- a/arkui-plugins/interop-plugins/index.ts +++ b/arkui-plugins/interop-plugins/index.ts @@ -13,7 +13,8 @@ * limitations under the License. */ -import * as arkts from '@koalaui/libarkts'; +import * as mirrorArkts from '@koalaui/libarkts-mirror'; +import * as arkts from '@koalaui/libarkts' import { DeclTransformer } from './decl_transformer'; import { EmitTransformer } from './emit_transformer'; @@ -29,19 +30,22 @@ export function interopTransform():Plugins { parsed: parsedTransform, checked: checkedTransform, clean() { - arkts.arktsGlobal.clearContext(); + mirrorArkts.arktsGlobal.clearContext(); }, }; } -function parsedTransform(this: PluginContext): arkts.EtsScript | undefined { - let script: arkts.EtsScript | undefined; +function parsedTransform(this: PluginContext): mirrorArkts.ETSModule | undefined { + let script: mirrorArkts.ETSModule | undefined; debugLog('interopTransform:parsed'); const contextPtr = arkts.arktsGlobal.compilerContext?.peer ?? this.getContextPtr(); + mirrorArkts.arktsGlobal.config = arkts.arktsGlobal.config if (!!contextPtr) { - let program = arkts.getOrUpdateGlobalContext(contextPtr).program; - script = program.astNode; - + let program = mirrorArkts.getOrUpdateGlobalContext(contextPtr).program; + script = program.ast; + console.log('arkts.arktsGlobal.context: ', arkts.arktsGlobal.context) + console.log('mirrorArkts.arktsGlobal.context: ', mirrorArkts.arktsGlobal.context) + debugLog(`interopTransform: script before parsing: ${script?.dumpSrc()}`) if (script) { const declTransformer = new DeclTransformer({ arkui: '@koalaui.arkts-arkui.StructParse' as interop.TransfromerName @@ -49,7 +53,7 @@ function parsedTransform(this: PluginContext): arkts.EtsScript | undefined { const programVisitor = new ProgramVisitor({ pluginName: interopTransform().name, - state: arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED, + state: mirrorArkts.Es2pandaContextState.ES2PANDA_STATE_PARSED, visitors: [declTransformer], skipPrefixNames: EXTERNAL_SOURCE_PREFIX_NAMES, pluginContext: this as unknown as PluginContext @@ -58,6 +62,7 @@ function parsedTransform(this: PluginContext): arkts.EtsScript | undefined { program = programVisitor.programVisitor(program); script = program.astNode; this.setArkTSAst(script); + debugLog(`interopTransform: script after parsing: ${script?.dumpSrc()}`) debugLog('interopTransform:parsed exit'); return script; } @@ -66,13 +71,18 @@ function parsedTransform(this: PluginContext): arkts.EtsScript | undefined { return script; } -function checkedTransform(this: PluginContext): arkts.EtsScript | undefined { - let script: arkts.EtsScript | undefined; +function checkedTransform(this: PluginContext): mirrorArkts.ETSModule | undefined { + let script: mirrorArkts.ETSModule | undefined; debugLog('interopTransform:checked'); + console.trace() + console.log('+++++++++++++++++++++++++++') const contextPtr = arkts.arktsGlobal.compilerContext?.peer ?? this.getContextPtr(); + console.log('+++++++++++++++++++++++++++') + mirrorArkts.arktsGlobal.config = arkts.arktsGlobal.config + console.log('+++++++++++++++++++++++++++') if (!!contextPtr) { - let program = arkts.getOrUpdateGlobalContext(contextPtr).program; - script = program.astNode; + let program = mirrorArkts.getOrUpdateGlobalContext(contextPtr).program; + script = program.ast; if (script) { const emitTransformer = new EmitTransformer({ arkui: '@koalaui.arkts-arkui.EmitBase' as interop.TransfromerName @@ -80,16 +90,17 @@ function checkedTransform(this: PluginContext): arkts.EtsScript | undefined { const programVisitor = new ProgramVisitor({ pluginName: interopTransform().name, - state: arkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED, + state: mirrorArkts.Es2pandaContextState.ES2PANDA_STATE_CHECKED, visitors: [emitTransformer], skipPrefixNames: EXTERNAL_SOURCE_PREFIX_NAMES, pluginContext: this as unknown as PluginContext }); program = programVisitor.programVisitor(program); - script = program.astNode; - arkts.recheckSubtree(script); + script = program.ast; + mirrorArkts.recheckSubtree(script!); this.setArkTSAst(script); + debugLog(`interopTransform: script after checking: ${script?.dumpSrc()}`) debugLog('interopTransform:checked exit'); return script; } diff --git a/arkui-plugins/test/demo/hello_world/declgenBridgeCodePath/entry/src/main/ets/pages/new.ts b/arkui-plugins/test/demo/hello_world/declgenBridgeCodePath/entry/src/main/ets/pages/new.ts new file mode 100644 index 000000000..54bad0aaa --- /dev/null +++ b/arkui-plugins/test/demo/hello_world/declgenBridgeCodePath/entry/src/main/ets/pages/new.ts @@ -0,0 +1,6 @@ +import type { ClickEvent } from "@ohos.arkui.component"; +import { Text, Column, Component, Entry, Button } from "@ohos.arkui.component"; +import { State, Link, Prop } from "@ohos.arkui.stateManagement"; +import hilog from "@ohos.hilog"; +let ETSGLOBAL = (globalThis as any).Panda.getClass('Lentry/src/main/ets/pages/new/ETSGLOBAL;'); +ETSGLOBAL._$init$_(); diff --git a/arkui-plugins/test/demo/hello_world/declgenV1OutPath/entry/src/main/ets/pages/new.d.ets b/arkui-plugins/test/demo/hello_world/declgenV1OutPath/entry/src/main/ets/pages/new.d.ets new file mode 100644 index 000000000..e69de29bb diff --git a/arkui-plugins/test/demo/localtest/build_decl_config.json b/arkui-plugins/test/demo/localtest/build_decl_config.json new file mode 100644 index 000000000..b6a8e0418 --- /dev/null +++ b/arkui-plugins/test/demo/localtest/build_decl_config.json @@ -0,0 +1,23 @@ +{ + "plugins": { + "interop_plugin": "/home/xza/ohos_pro/ohos/out/sdk/ohos-sdk/linux/ets/ets1.2/build-tools/ui-plugins/lib/interop-plugins/index" + }, + "compileFiles": [ + "./demo/localtest/entry/src/main/ets/pages/new.ets" + ], + "packageName": "entry", + "buildType": "build", + "buildMode": "Debug", + "moduleRootPath": "./demo/localtest/entry/", + "sourceRoots": [ + "./" + ], + "loaderOutPath": "./dist", + "cachePath": "./dist/cache", + "buildSdkPath": "/home/xza/ohos_pro/ohos/out/sdk/ohos-sdk/linux/ets/ets1.2/", + "dependentModuleList": [], + "isIDE": "false", + "enableDeclgenEts2Ts": true, + "declgenV1OutPath": "/home/xza/ohos_pro/ohos/developtools/ace_ets2bundle/arkui-plugins/test/demo/hello_world/declgenV1OutPath", + "declgenBridgeCodePath": "/home/xza/ohos_pro/ohos/developtools/ace_ets2bundle/arkui-plugins/test/demo/hello_world/declgenBridgeCodePath" +} \ No newline at end of file diff --git a/arkui-plugins/test/demo/localtest/build_decl_config_template.json b/arkui-plugins/test/demo/localtest/build_decl_config_template.json index fc58a0e00..b546d4773 100644 --- a/arkui-plugins/test/demo/localtest/build_decl_config_template.json +++ b/arkui-plugins/test/demo/localtest/build_decl_config_template.json @@ -4,7 +4,7 @@ }, "compileFiles": [ - "./demo/localtest/entry/new.ets" + "./demo/localtest/entry/src/main/ets/pages/new.ets" ], "packageName" : "entry", diff --git a/arkui-plugins/ui-plugins/index.ts b/arkui-plugins/ui-plugins/index.ts index 8751ffc4f..5911528e7 100644 --- a/arkui-plugins/ui-plugins/index.ts +++ b/arkui-plugins/ui-plugins/index.ts @@ -53,7 +53,7 @@ function parsedTransform(this: PluginContext): arkts.EtsScript | undefined { ); arkts.Performance.getInstance().createEvent('ui-parsed'); program = parsedProgramVisit(program, this); - script = program.astNode; + script = program.astNode; arkts.Performance.getInstance().stopEvent('ui-parsed', true); debugLog('[AFTER PARSED SCRIPT] script: ', script.dumpSrc()); debugDump( diff --git a/koala-wrapper/src/Es2pandaEnums.ts b/koala-wrapper/src/Es2pandaEnums.ts index 6a16486a7..7c287f65a 100644 --- a/koala-wrapper/src/Es2pandaEnums.ts +++ b/koala-wrapper/src/Es2pandaEnums.ts @@ -70,6 +70,7 @@ export enum Es2pandaAstNodeType { AST_NODE_TYPE_UNDEFINED_LITERAL, AST_NODE_TYPE_NUMBER_LITERAL, AST_NODE_TYPE_OMITTED_EXPRESSION, + AST_NODE_TYPE_OVERLOAD_DECLARATION, AST_NODE_TYPE_PREFIX_ASSERTION_EXPRESSION, AST_NODE_TYPE_PROPERTY, AST_NODE_TYPE_REGEXP_LITERAL, @@ -83,6 +84,7 @@ export enum Es2pandaAstNodeType { AST_NODE_TYPE_ETS_UNDEFINED_TYPE, AST_NODE_TYPE_ETS_NEVER_TYPE, AST_NODE_TYPE_ETS_STRING_LITERAL_TYPE, + AST_NODE_TYPE_ETS_INTRINSIC_NODE_TYPE, AST_NODE_TYPE_ETS_FUNCTION_TYPE, AST_NODE_TYPE_ETS_WILDCARD_TYPE, AST_NODE_TYPE_ETS_PRIMITIVE_TYPE, @@ -172,7 +174,7 @@ export enum Es2pandaAstNodeType { AST_NODE_TYPE_YIELD_EXPRESSION, AST_NODE_TYPE_OPAQUE_TYPE_NODE, AST_NODE_TYPE_BLOCK_EXPRESSION, - AST_NODE_TYPE_ERROR_TYPE_NODE, + AST_NODE_TYPE_BROKEN_TYPE_NODE, AST_NODE_TYPE_ARRAY_EXPRESSION, AST_NODE_TYPE_ARRAY_PATTERN, AST_NODE_TYPE_ASSIGNMENT_EXPRESSION, -- Gitee