From a74c8afbd9a3ec52f981e7659ae77e5a74d91a4c Mon Sep 17 00:00:00 2001 From: dongchao Date: Wed, 28 May 2025 01:02:50 +0800 Subject: [PATCH] Fix record and ui import scenes in declgen_ets2ts Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICB00S Signed-off-by: dongchao Change-Id: I20704226facf3909a70d9c47570cc45a016e478b --- ets2panda/bindings/native/src/bridges.cpp | 8 ++-- .../bindings/src/Es2pandaNativeModule.ts | 3 +- ets2panda/bindings/src/driver_helper.ts | 4 +- ets2panda/declgen_ets2ts/declgenEts2Ts.cpp | 42 +++++++++++++++---- ets2panda/declgen_ets2ts/declgenEts2Ts.h | 2 + .../build_system/src/build/base_mode.ts | 3 +- ets2panda/public/es2panda_lib.cpp | 4 +- ets2panda/public/es2panda_lib.h | 2 +- 8 files changed, 49 insertions(+), 19 deletions(-) diff --git a/ets2panda/bindings/native/src/bridges.cpp b/ets2panda/bindings/native/src/bridges.cpp index 2757d4b9ef..c08470167d 100644 --- a/ets2panda/bindings/native/src/bridges.cpp +++ b/ets2panda/bindings/native/src/bridges.cpp @@ -37,13 +37,13 @@ KNativePointer impl_CreateContextFromString(KNativePointer configPtr, KStringPtr TS_INTEROP_3(CreateContextFromString, KNativePointer, KNativePointer, KStringPtr, KStringPtr) KInt impl_GenerateTsDeclarationsFromContext(KNativePointer contextPtr, KStringPtr &outputDeclEts, KStringPtr &outputEts, - KBoolean exportAll) + KBoolean exportAll, KStringPtr &recordFilePath) { auto context = reinterpret_cast(contextPtr); - return static_cast(GetPublicImpl()->GenerateTsDeclarationsFromContext(context, outputDeclEts.data(), - outputEts.data(), exportAll != 0)); + return static_cast(GetPublicImpl()->GenerateTsDeclarationsFromContext( + context, outputDeclEts.data(), outputEts.data(), exportAll != 0, recordFilePath.data())); } -TS_INTEROP_4(GenerateTsDeclarationsFromContext, KInt, KNativePointer, KStringPtr, KStringPtr, KBoolean) +TS_INTEROP_4(GenerateTsDeclarationsFromContext, KInt, KNativePointer, KStringPtr, KStringPtr, KBoolean, KStringPtr) KNativePointer impl_CreateContextFromFile(KNativePointer configPtr, KStringPtr &filenamePtr) { diff --git a/ets2panda/bindings/src/Es2pandaNativeModule.ts b/ets2panda/bindings/src/Es2pandaNativeModule.ts index 0c2bf515c2..18ce2fe5a2 100644 --- a/ets2panda/bindings/src/Es2pandaNativeModule.ts +++ b/ets2panda/bindings/src/Es2pandaNativeModule.ts @@ -65,7 +65,8 @@ export class Es2pandaNativeModule { config: KPtr, outputDeclEts: String, outputEts: String, - exportAll: KBoolean + exportAll: KBoolean, + recordFilePath: String ): KPtr { throw new Error('Not implemented'); } diff --git a/ets2panda/bindings/src/driver_helper.ts b/ets2panda/bindings/src/driver_helper.ts index 29f82f3d01..371df3ea23 100644 --- a/ets2panda/bindings/src/driver_helper.ts +++ b/ets2panda/bindings/src/driver_helper.ts @@ -76,9 +76,9 @@ export class DriverHelper { global.destroyCfg(); } - public generateTsDecl(declOutPath: string, etsOutPath: string, exportAll: boolean): void { + public generateTsDecl(declOutPath: string, etsOutPath: string, exportAll: boolean, recordFilePath: string): void { let exportAll_: KBoolean = exportAll ? 1 : 0; - global.es2panda._GenerateTsDeclarationsFromContext(this._cfg.peer, declOutPath, etsOutPath, exportAll_); + global.es2panda._GenerateTsDeclarationsFromContext(this._cfg.peer, declOutPath, etsOutPath, exportAll_, recordFilePath); } } diff --git a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp index 6dd04a3916..e528d6d2a9 100644 --- a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp +++ b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp @@ -35,6 +35,14 @@ #include "ir/ts/tsTypeAliasDeclaration.h" #include "ir/ts/tsTypeParameter.h" +#if __has_include() +#include +namespace fs = std::filesystem; +#elif __has_include() +#include +namespace fs = std::experimental::filesystem; +#endif + #define DEBUG_PRINT 0 namespace ark::es2panda::declgen_ets2ts { @@ -53,7 +61,6 @@ bool TSDeclGen::Generate() } CollectIndirectExportDependencies(); GenDeclarations(); - GenOtherDeclarations(); return true; } @@ -269,17 +276,14 @@ void TSDeclGen::GenDeclarations() } } -void TSDeclGen::GenOtherDeclarations() +void TSDeclGen::GenOtherDeclarations(const std::string &outputDeclEts, const std::string &recordFilePath) { const std::string recordKey = "Record"; - const std::string recordStr = R"( -// generated for static Record -type Record = { - [P in K]: T; -}; -)"; if (indirectDependencyObjects_.find(recordKey) != indirectDependencyObjects_.end()) { - OutDts(recordStr); + fs::path fromPath(outputDeclEts); + fs::path toPath(recordFilePath); + fs::path relativePath = fs::relative(toPath, fromPath.parent_path()); + OutDts("import type { ", recordKey, " } from \"", relativePath, "\";"); } } @@ -965,6 +969,7 @@ void TSDeclGen::GenAnnotations(const T *node) if (!state_.inGlobalClass && (state_.inClass || state_.inInterface)) { ProcessIndent(); } + importSet_.insert(anno->GetBaseName()->Name().Mutf8()); OutDts("@", anno->GetBaseName()->Name()); GenAnnotationProperties(anno); OutEndlDts(); @@ -1107,6 +1112,9 @@ std::vector TSDeclGen::FilterValidImportSpecifiers(const ArenaVec std::vector importSpecifiers; for (auto specifier : specifiers) { const auto local = specifier->AsImportSpecifier()->Local()->Name().Mutf8(); + if (specifier->AsImportSpecifier()->IsRemovable()) { + continue; + } if (importSet_.find(local) != importSet_.end()) { importSpecifiers.push_back(specifier); } @@ -2086,6 +2094,22 @@ bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::p declBuilder.ResetTsOutput(); declBuilder.ResetDtsOutput(); + if (!declBuilder.GetDeclgenOptions().recordFilePath.empty()) { + if (!ark::os::IsFileExists(declBuilder.GetDeclgenOptions().recordFilePath)) { + const std::string recordStr = R"( + // generated for static Record + type Record = { + [P in K]: T; + }; + )"; + if (!WriteToFile(declBuilder.GetDeclgenOptions().recordFilePath, recordStr, checker)) { + return false; + } + } + + declBuilder.GenOtherDeclarations(declBuilder.GetDeclgenOptions().outputDeclEts, + declBuilder.GetDeclgenOptions().recordFilePath); + } declBuilder.GenImportDeclarations(); std::string importOutputEts = declBuilder.GetTsOutput(); diff --git a/ets2panda/declgen_ets2ts/declgenEts2Ts.h b/ets2panda/declgen_ets2ts/declgenEts2Ts.h index fda8c826a1..a1d7983e97 100644 --- a/ets2panda/declgen_ets2ts/declgenEts2Ts.h +++ b/ets2panda/declgen_ets2ts/declgenEts2Ts.h @@ -30,6 +30,7 @@ struct DeclgenOptions { bool isIsolatedDeclgen = false; std::string outputDeclEts; std::string outputEts; + std::string recordFilePath; }; // Consume program after checker stage and generate out_path typescript file with declarations @@ -61,6 +62,7 @@ public: } bool Generate(); + void GenOtherDeclarations(const std::string &outputDeclEts, const std::string &recordFilePath); void GenImportDeclarations(); std::string GetDtsOutput() const diff --git a/ets2panda/driver/build_system/src/build/base_mode.ts b/ets2panda/driver/build_system/src/build/base_mode.ts index 035ee1eb79..febe9a2a14 100644 --- a/ets2panda/driver/build_system/src/build/base_mode.ts +++ b/ets2panda/driver/build_system/src/build/base_mode.ts @@ -173,7 +173,8 @@ export abstract class BaseMode { arkts.generateTsDeclarationsFromContext( declEtsOutputPath, etsOutputPath, - false + false, + path.join(moduleInfo.declgenV1OutPath as string, moduleInfo.packageName, "static.Record.d.ts") ); // Generate 1.0 declaration files & 1.0 glue code this.logger.printInfo('declaration files generated'); } catch (error) { diff --git a/ets2panda/public/es2panda_lib.cpp b/ets2panda/public/es2panda_lib.cpp index 68c404993f..da7b89712d 100644 --- a/ets2panda/public/es2panda_lib.cpp +++ b/ets2panda/public/es2panda_lib.cpp @@ -997,7 +997,8 @@ extern "C" es2panda_AstNode **AllDeclarationsByNameFromProgram([[maybe_unused]] extern "C" __attribute__((unused)) int GenerateTsDeclarationsFromContext(es2panda_Context *ctx, const char *outputDeclEts, - const char *outputEts, bool exportAll) + const char *outputEts, bool exportAll, + const char *recordFilePath) { auto *ctxImpl = reinterpret_cast(ctx); auto *checker = reinterpret_cast(ctxImpl->checker); @@ -1006,6 +1007,7 @@ extern "C" __attribute__((unused)) int GenerateTsDeclarationsFromContext(es2pand declgenOptions.exportAll = exportAll; declgenOptions.outputDeclEts = outputDeclEts ? outputDeclEts : ""; declgenOptions.outputEts = outputEts ? outputEts : ""; + declgenOptions.outputEts = recordFilePath ? recordFilePath : ""; return ark::es2panda::declgen_ets2ts::GenerateTsDeclarations(checker, ctxImpl->parserProgram, declgenOptions) ? 0 : 1; diff --git a/ets2panda/public/es2panda_lib.h b/ets2panda/public/es2panda_lib.h index b331f56829..bda711cbe0 100644 --- a/ets2panda/public/es2panda_lib.h +++ b/ets2panda/public/es2panda_lib.h @@ -252,7 +252,7 @@ struct CAPI_EXPORT es2panda_Impl { const char *name, size_t *declsLen); int (*GenerateTsDeclarationsFromContext)(es2panda_Context *context, const char *outputDeclEts, - const char *outputEts, bool exportAll); + const char *outputEts, bool exportAll, const char *recordFilePath); void (*InsertETSImportDeclarationAndParse)(es2panda_Context *context, es2panda_Program *program, es2panda_AstNode *importDeclaration); int (*GenerateStaticDeclarationsFromContext)(es2panda_Context *context, const char *outputPath); -- Gitee