diff --git a/BUILD.gn b/BUILD.gn index c703e73b4015b56d04e74aa942a7cbcccf11ec90..fa0a209d8f94e4e78cf29dd400d2c3aee73d6bfb 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -43,7 +43,7 @@ action("build_ets_loader_library") { deps = [ ":components", ":form_components", - ":install_arkguard_tsc", + ":install_arkguard_tsc_declgen", ":server", ] script = "build_ets_loader_library.py" @@ -171,7 +171,7 @@ ets_loader_sources = [ ohos_copy("ets_loader") { deps = [ ":build_ets_loader_library", - ":install_arkguard_tsc", + ":install_arkguard_tsc_declgen", ] sources = ets_loader_sources deps += [ ":build_ets_sysResource" ] @@ -258,7 +258,7 @@ ohos_copy("ets_loader_declaration") { ohos_copy("ets_loader_ark") { deps = [ ":build_ets_loader_library", - ":install_arkguard_tsc", + ":install_arkguard_tsc_declgen", ] sources = ets_loader_sources deps += [ ":build_ets_sysResource" ] @@ -352,18 +352,22 @@ ohos_copy("ets_loader_ark_hap") { typescript_dir = get_label_info("//third_party/typescript:build_typescript", "target_out_dir") -action("install_arkguard_tsc") { +action("install_arkguard_tsc_declgen") { + static_core = "//arkcompiler/runtime_core/static_core" deps = [ + "${static_core}/plugins/ets/tools/declgen_ts2sts:build_declgen", "//arkcompiler/ets_frontend/arkguard:build_arkguard", "//third_party/typescript:build_typescript", ] - script = "install_arkguard_tsc.py" + script = "install_arkguard_tsc_declgen.py" args = [ rebase_path("${typescript_dir}/ohos-typescript-4.9.5-r4.tgz"), rebase_path( "${root_out_dir}/obj/arkcompiler/ets_frontend/arkguard/arkguard-1.1.3.tgz"), rebase_path("//developtools/ace_ets2bundle/compiler"), current_os, + rebase_path( + "${root_out_dir}/obj/arkcompiler/runtime_core/static_core/plugins/ets/tools/declgen_ts2sts/panda-declgen-1.0.0.tgz"), ] outputs = [ "${target_out_dir}/${target_name}.stamp" ] } diff --git a/compiler/script/install_declgen.sh b/compiler/script/install_declgen.sh new file mode 100755 index 0000000000000000000000000000000000000000..ca35365e44c76bfe92c8df4734ac8d3c1116b7a4 --- /dev/null +++ b/compiler/script/install_declgen.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Copyright (c) 2025 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#!/bin/bash +set -e + +if [ ! -d "../compiler" ]; then + echo "Error: must run this script in ace_ets2bundle/compiler root directory" + exit 1 +fi + +oriDir=$(pwd) + +DECLGEN_ROOT_DIR="../../../arkcompiler/runtime_core/static_core/plugins/ets/tools/declgen_ts2sts" + +cd "$DECLGEN_ROOT_DIR" || { echo "Failed to change directory to $DECLGEN_ROOT_DIR"; exit 1; } + +npm install +npm run build + +# Generate the npm package using `npm pack` +if npm pack; then + tarball=$(ls *.tgz) # Get the generated tarball file name + if [ -f "$tarball" ]; then + # Move the tarball to the original directory + mv "$tarball" "$oriDir/" + + # Go back to the original directory and extract the tarball + cd "$oriDir" + tar -xvzf "$tarball" + + # Rename the extracted directory (assuming it is named after the package) + extracted_dir=$(tar -tf "$tarball" | head -n 1 | cut -f1 -d"/") # Get the extracted folder name + mv "$extracted_dir" "./node_modules/declgen" # Rename to 'declgen' + + # Optionally, remove the tarball after extraction + rm "$tarball" + + echo "Build successfully packed, extracted, and renamed to 'declgen' in $oriDir" + else + echo "Error: No tarball found, cannot proceed" + exit 1 + fi +else + echo "Error: npm pack failed" + exit 1 +fi diff --git a/compiler/src/ets_checker.ts b/compiler/src/ets_checker.ts index 7a4bf0a73945a27eee6f515afec16ead3dd2afc5..76e31bebb19ef5ad41cecac255d9dc70ab5df8e6 100644 --- a/compiler/src/ets_checker.ts +++ b/compiler/src/ets_checker.ts @@ -94,6 +94,10 @@ import { getJsDocNodeConditionCheckResult } from './fast_build/system_api/api_check_utils'; import { sourceFileDependencies } from './fast_build/ark_compiler/common/ob_config_resolver'; +import { + RunnerParms, + generateInteropDecls +} from '../node_modules/declgen/build/src/generateInteropDecls' export interface LanguageServiceCache { service?: ts.LanguageService; @@ -518,7 +522,9 @@ export function serviceChecker(rootFileNames: string[], newLogger: Object = null if (process.env.watchMode !== 'true') { processBuildHap(cacheFile, rootFileNames, compilationTime, rollupShareObject); } - + if (rollupShareObject?.projectConfig.mixCompile) { + generateDeclarationFileForSTS(rootFileNames, allResolvedModules); + } if (globalProgram.program && (process.env.watchMode !== 'true' && !projectConfig.isPreview && !projectConfig.hotReload && !projectConfig.coldReload)) { @@ -1672,3 +1678,29 @@ export function resetEtsCheck(): void { targetESVersionChanged = false; fileToIgnoreDiagnostics = undefined; } + +export function generateDeclarationFileForSTS(rootFileNames: string[], allResolvedModules: Set) { + if (!(projectConfig.compileHar || projectConfig.compileShared)) { + return; + } + const unixRootFileNames = rootFileNames.map(path => { + return toUnixPath(path); + }); + + const uniqueFiles = Array.from(new Set([ + ...unixRootFileNames, + ...allResolvedModules + ])); + + const config: RunnerParms = { + inputDirs: [], + inputFiles: uniqueFiles, + outDir: path.resolve(projectConfig.aceModuleBuild, '../etsFortgz/ets'), + rootDir: projectConfig.projectRootPath, + customResolveModuleNames: resolveModuleNames + }; + if (fs.existsSync(config.outDir)) { + fs.rmSync(config.outDir, { recursive: true, force: true }); + } + generateInteropDecls(config); +} \ No newline at end of file diff --git a/install_arkguard_tsc.py b/install_arkguard_tsc_declgen.py similarity index 96% rename from install_arkguard_tsc.py rename to install_arkguard_tsc_declgen.py index 61284e51e238b9680f46aa20aedd8a62681fb525..5fb5d0c1b304d1d4ad2fda777873999e1a791550 100755 --- a/install_arkguard_tsc.py +++ b/install_arkguard_tsc_declgen.py @@ -54,10 +54,11 @@ def run(args): arkguard_path = args[1] source_path = args[2] current_os = args[3] + declgen_path = args[4] node_modules_path = os.path.join(source_path, "node_modules") extract(tsc_path, node_modules_path, 'typescript', current_os) extract(arkguard_path, node_modules_path, 'arkguard', current_os) - + extract(declgen_path, node_modules_path, 'declgen', current_os) if __name__ == "__main__": run(sys.argv[1:]) \ No newline at end of file