diff --git a/ets2panda/bindings/native/src/bridges.cpp b/ets2panda/bindings/native/src/bridges.cpp index 2757d4b9efc5081982efaa7c6d2959a303405bd9..c08470167dafd8cc23e24cb6621bf80b31f41298 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 0c2bf515c28e7778bfadcbd9cb09ed5e3ae3d276..18ce2fe5a2309b7f7429351a58706a4c5b8560a8 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 29f82f3d0133095d21558faa4e4d3a501234b6ac..371df3ea23a4baf6fcff80e2b11fa815b85bcd62 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 6dd04a39169bc1a6322c4ae0f50be0252214ab9c..e528d6d2a9a7c344a4dd84dfaba760d6b0c11179 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 fda8c826a15d05038efc471d48d552d46139fdf6..a1d7983e97cfc297e8655d52c93864f8212dddd6 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 035ee1eb79ee52a0a67f0e563b41e2b514536a5c..febe9a2a14b1dd576a76dd4bceb189af46f04aac 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 68c404993fe37dbe0d4d8bd25d9457fb5ad5ad9e..da7b89712d221db5b3455341188d96e9c93e704b 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 b331f5682953c8da1608024a26a68d4458fd4b91..bda711cbe0e886e35e58fa1f2d8f400016208257 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);