From 26a03e4aa760c2e30ee4a7c6573b6a9b07d28c04 Mon Sep 17 00:00:00 2001 From: dongchao Date: Fri, 8 Aug 2025 16:19:56 +0800 Subject: [PATCH] Add GetTsDeclarationsFromContext CAPI Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICS33A Signed-off-by: dongchao Change-Id: Ifca145f7ca47c998e2ccb6f7a1cb3a9312afca4b --- ets2panda/declgen_ets2ts/declgenEts2Ts.cpp | 42 +++++++++++++++------- ets2panda/declgen_ets2ts/declgenEts2Ts.h | 11 ++++++ ets2panda/public/es2panda_lib.cpp | 20 +++++++++++ ets2panda/public/es2panda_lib.h | 2 ++ 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp index 40b69aa39d..5b94398286 100644 --- a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp +++ b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp @@ -2532,9 +2532,12 @@ bool WriteToFile(const std::string &path, const std::string &content, checker::E return true; } -bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::parser::Program *program, - const DeclgenOptions &declgenOptions) +TsDeclarationsResult GenerateDeclarationsInternal(checker::ETSChecker *checker, + const ark::es2panda::parser::Program *program, + const DeclgenOptions &declgenOptions) { + TsDeclarationsResult result; + declgen::IsolatedDeclgenChecker isolatedDeclgenChecker(checker->DiagnosticEngine(), *program); if (declgenOptions.isolated) { isolatedDeclgenChecker.Check(); @@ -2544,16 +2547,15 @@ bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::p declBuilder.SetDeclgenOptions(declgenOptions); if (!ValidateDeclgenOptions(declBuilder.GetDeclgenOptions(), checker)) { - return false; + return result; } if (!declBuilder.Generate()) { - return false; + return result; } std::string outputEts = declBuilder.GetTsOutput(); std::string outputDEts = declBuilder.GetDtsOutput(); - declBuilder.ResetTsOutput(); declBuilder.ResetDtsOutput(); @@ -2561,30 +2563,44 @@ bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::p int32_t firstPhaseId = -1; compiler::GetPhaseManager()->SetCurrentPhaseIdWithoutReCheck(firstPhaseId); declBuilder.GenExportNamedDeclarations(); - std::string exportOutputEts = declBuilder.GetTsOutput(); std::string exportOutputDEts = declBuilder.GetDtsOutput(); - declBuilder.ResetTsOutput(); declBuilder.ResetDtsOutput(); compiler::GetPhaseManager()->SetCurrentPhaseIdWithoutReCheck(afterCheckerId); declBuilder.GenImportDeclarations(); - std::string importOutputEts = declBuilder.GetTsOutput(); std::string importOutputDEts = declBuilder.GetDtsOutput(); - std::string combineEts = importOutputEts + outputEts + exportOutputEts; - std::string combinedDEts = importOutputDEts + outputDEts + exportOutputDEts; + result.glueCodeContent = importOutputEts + outputEts + exportOutputEts; + result.declContent = importOutputDEts + outputDEts + exportOutputDEts; if (!declBuilder.GetDeclgenOptions().recordFile.empty()) { declBuilder.ResetDtsOutput(); declBuilder.GenImportRecordDeclarations(declBuilder.GetDeclgenOptions().recordFile); - std::string recordImportOutputDEts = declBuilder.GetDtsOutput(); - combinedDEts = recordImportOutputDEts + combinedDEts; + result.declContent = declBuilder.GetDtsOutput() + result.declContent; } - return WriteOutputFiles(declBuilder.GetDeclgenOptions(), combineEts, combinedDEts, checker); + result.isSuccess = true; + return result; +} + +bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::parser::Program *program, + const DeclgenOptions &declgenOptions) +{ + auto result = GenerateDeclarationsInternal(checker, program, declgenOptions); + if (!result.isSuccess) { + return false; + } + return WriteOutputFiles(declgenOptions, result.glueCodeContent, result.declContent, checker); +} + +std::string GetTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::parser::Program *program, + const DeclgenOptions &declgenOptions) +{ + auto result = GenerateDeclarationsInternal(checker, program, declgenOptions); + return result.isSuccess ? result.declContent : ""; } bool ValidateDeclgenOptions(const DeclgenOptions &options, checker::ETSChecker *checker) diff --git a/ets2panda/declgen_ets2ts/declgenEts2Ts.h b/ets2panda/declgen_ets2ts/declgenEts2Ts.h index 6f868df50d..3bf8542e1d 100644 --- a/ets2panda/declgen_ets2ts/declgenEts2Ts.h +++ b/ets2panda/declgen_ets2ts/declgenEts2Ts.h @@ -37,9 +37,20 @@ struct DeclgenOptions { std::string recordFile; }; +struct TsDeclarationsResult { + std::string declContent; + std::string glueCodeContent; + bool isSuccess = false; +}; + // Consume program after checker stage and generate out_path typescript file with declarations bool GenerateTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::parser::Program *program, const DeclgenOptions &declgenOptions); +TsDeclarationsResult GenerateDeclarationsInternal(checker::ETSChecker *checker, + const ark::es2panda::parser::Program *program, + const DeclgenOptions &declgenOptions); +std::string GetTsDeclarations(checker::ETSChecker *checker, const ark::es2panda::parser::Program *program, + const DeclgenOptions &declgenOptions); bool ValidateDeclgenOptions(const DeclgenOptions &options, checker::ETSChecker *checker); bool WriteOutputFiles(const DeclgenOptions &options, const std::string &combinedEts, const std::string &combinedDEts, checker::ETSChecker *checker); diff --git a/ets2panda/public/es2panda_lib.cpp b/ets2panda/public/es2panda_lib.cpp index f9295c138b..f021244ca3 100644 --- a/ets2panda/public/es2panda_lib.cpp +++ b/ets2panda/public/es2panda_lib.cpp @@ -1285,6 +1285,25 @@ extern "C" __attribute__((unused)) int GenerateTsDeclarationsFromContext(es2pand : 1; } +extern "C" __attribute__((unused)) char *GetTsDeclarationsFromContext(es2panda_Context *ctx, const char *outputDeclEts, + const char *outputEts, bool exportAll, + bool isolated, const char *recordFile) +{ + auto *allocator = reinterpret_cast(ctx)->allocator; + auto *ctxImpl = reinterpret_cast(ctx); + auto *checker = reinterpret_cast(ctxImpl->GetChecker()); + + ark::es2panda::declgen_ets2ts::DeclgenOptions declgenOptions; + declgenOptions.exportAll = exportAll; + declgenOptions.outputDeclEts = outputDeclEts ? outputDeclEts : ""; + declgenOptions.outputEts = outputEts ? outputEts : ""; + declgenOptions.isolated = isolated; + declgenOptions.recordFile = recordFile ? recordFile : ""; + + return StringViewToCString( + allocator, ark::es2panda::declgen_ets2ts::GetTsDeclarations(checker, ctxImpl->parserProgram, declgenOptions)); +} + // Will be removed after binary import support is fully implemented. extern "C" __attribute__((unused)) int GenerateStaticDeclarationsFromContext(es2panda_Context *ctx, const char *outputPath) @@ -1414,6 +1433,7 @@ es2panda_Impl g_impl = { AllDeclarationsByNameFromNode, AllDeclarationsByNameFromProgram, GenerateTsDeclarationsFromContext, + GetTsDeclarationsFromContext, InsertETSImportDeclarationAndParse, GenerateStaticDeclarationsFromContext, InvalidateFileCache, diff --git a/ets2panda/public/es2panda_lib.h b/ets2panda/public/es2panda_lib.h index 9455780678..14fb8c944c 100644 --- a/ets2panda/public/es2panda_lib.h +++ b/ets2panda/public/es2panda_lib.h @@ -274,6 +274,8 @@ struct CAPI_EXPORT es2panda_Impl { int (*GenerateTsDeclarationsFromContext)(es2panda_Context *context, const char *outputDeclEts, const char *outputEts, bool exportAll, bool isolated, const char *recordFile); + char *(*GetTsDeclarationsFromContext)(es2panda_Context *context, const char *outputDeclEts, const char *outputEts, + bool exportAll, bool isolated, const char *recordFile); void (*InsertETSImportDeclarationAndParse)(es2panda_Context *context, es2panda_Program *program, es2panda_AstNode *importDeclaration); int (*GenerateStaticDeclarationsFromContext)(es2panda_Context *context, const char *outputPath); -- Gitee