From 91025251a3dd9093153b5b6a9700943f9559ffec Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Mon, 13 Mar 2023 11:13:54 +0800 Subject: [PATCH] Support compatibleSdkVersion Add pull request template Add the option 'target-api-version' for es2abc/js2abc/merge_abc to specify the target api version for compilation Add the option 'supported-api' to print supported apis and corresponding bytecode versions Issue: #I6JD9J Signed-off-by: zhangrengao Change-Id: If0b289a988a0345ec371cd2f9dc1eb3ed33f3ab1 --- .gitee/PULL_REQUEST_TEMPLATE.en.md | 18 ++++++++++++++++++ es2panda/aot/emitFiles.cpp | 10 ++++++---- es2panda/aot/emitFiles.h | 11 +++++++---- es2panda/aot/main.cpp | 5 +++++ es2panda/aot/options.cpp | 13 +++++++++++-- es2panda/aot/options.h | 8 ++++++++ es2panda/compiler/core/compileQueue.cpp | 4 +++- es2panda/es2panda.h | 2 ++ es2panda/util/helpers.cpp | 7 +++++-- es2panda/util/helpers.h | 2 +- merge_abc/src/main.cpp | 3 ++- merge_abc/src/options.cpp | 5 +++++ merge_abc/src/options.h | 5 +++++ ts2panda/src/cmdOptions.ts | 10 +++++++++- ts2panda/src/ts2panda.ts | 3 ++- ts2panda/ts2abc/ts2abc.cpp | 21 ++++++++++++++++++--- ts2panda/ts2abc/ts2abc_options.h | 18 ++++++++++++++++++ 17 files changed, 125 insertions(+), 20 deletions(-) create mode 100644 .gitee/PULL_REQUEST_TEMPLATE.en.md diff --git a/.gitee/PULL_REQUEST_TEMPLATE.en.md b/.gitee/PULL_REQUEST_TEMPLATE.en.md new file mode 100644 index 0000000000..22132a108f --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE.en.md @@ -0,0 +1,18 @@ +### 1. Issue + + +### 2. Description + + +### 3. Check list + +If PR has one of the following changes, then PR needs the approval of @qiuyu22. + +- [ ] PR changes file format (such as addition, deletion or modification of the file structures) +- [ ] PR changes bytecode set (such as addition, deletion or modification of the current bytecode set) +- [ ] PR changes file items (such as addition, deletion or modification of the field, annotation, literalarray) +- [ ] PR introduces unstable data structures that can cause inconsistency of abc files +- [ ] PR supports new feature so that some new test262 tests should be enabled +- [ ] PR changes the format of cache files + +### 4. Test Results diff --git a/es2panda/aot/emitFiles.cpp b/es2panda/aot/emitFiles.cpp index 462708ae15..dbf01af239 100644 --- a/es2panda/aot/emitFiles.cpp +++ b/es2panda/aot/emitFiles.cpp @@ -25,10 +25,11 @@ void EmitFileQueue::Schedule() { ASSERT(jobsCount_ == 0); std::unique_lock lock(m_); + auto targetApi = static_cast(options_->TargetApiVersion()); // generate abcs if (mergeAbc_) { - auto emitMergedAbcJob = new EmitMergedAbcJob(options_->CompilerOutput(), progsInfo_); + auto emitMergedAbcJob = new EmitMergedAbcJob(options_->CompilerOutput(), progsInfo_, targetApi); jobs_.push_back(emitMergedAbcJob); jobsCount_++; } else { @@ -36,7 +37,8 @@ void EmitFileQueue::Schedule() try { auto outputFileName = options_->OutputFiles().empty() ? options_->CompilerOutput() : options_->OutputFiles().at(info.first); - auto emitSingleAbcJob = new EmitSingleAbcJob(outputFileName, &(info.second->program), statp_); + auto emitSingleAbcJob = new EmitSingleAbcJob(outputFileName, &(info.second->program), statp_, + targetApi); jobs_.push_back(emitSingleAbcJob); jobsCount_++; } catch (std::exception &error) { @@ -65,7 +67,7 @@ void EmitFileQueue::Schedule() void EmitSingleAbcJob::Run() { if (!panda::pandasm::AsmEmitter::Emit(panda::os::file::File::GetExtendedFilePath(outputFileName_), *prog_, statp_, - nullptr, true)) { + nullptr, true, nullptr, targetApiVersion_)) { throw Error(ErrorType::GENERIC, "Failed to emit " + outputFileName_ + ", error: " + panda::pandasm::AsmEmitter::GetLastError()); } @@ -79,7 +81,7 @@ void EmitMergedAbcJob::Run() progs.push_back(&(info.second->program)); } if (!panda::pandasm::AsmEmitter::EmitPrograms(panda::os::file::File::GetExtendedFilePath(outputFileName_), progs, - true)) { + true, targetApiVersion_)) { throw Error(ErrorType::GENERIC, "Failed to emit " + outputFileName_ + ", error: " + panda::pandasm::AsmEmitter::GetLastError()); } diff --git a/es2panda/aot/emitFiles.h b/es2panda/aot/emitFiles.h index 808393ecad..ee58996d1b 100644 --- a/es2panda/aot/emitFiles.h +++ b/es2panda/aot/emitFiles.h @@ -25,8 +25,8 @@ namespace panda::es2panda::aot { class EmitSingleAbcJob : public util::WorkerJob { public: explicit EmitSingleAbcJob(const std::string &outputFileName, panda::pandasm::Program *prog, - std::map *statp) - : outputFileName_(outputFileName), prog_(prog), statp_(statp) {}; + std::map *statp, uint8_t targetApi) + : outputFileName_(outputFileName), prog_(prog), statp_(statp), targetApiVersion_(targetApi) {}; NO_COPY_SEMANTIC(EmitSingleAbcJob); NO_MOVE_SEMANTIC(EmitSingleAbcJob); ~EmitSingleAbcJob() override = default; @@ -36,13 +36,15 @@ private: std::string outputFileName_; panda::pandasm::Program *prog_; std::map *statp_; + uint8_t targetApiVersion_ = 0; }; class EmitMergedAbcJob : public util::WorkerJob { public: explicit EmitMergedAbcJob(const std::string &outputFileName, - const std::map &progsInfo) - : outputFileName_(outputFileName), progsInfo_(progsInfo) {}; + const std::map &progsInfo, + uint8_t targetApi) + : outputFileName_(outputFileName), progsInfo_(progsInfo), targetApiVersion_(targetApi) {}; NO_COPY_SEMANTIC(EmitMergedAbcJob); NO_MOVE_SEMANTIC(EmitMergedAbcJob); ~EmitMergedAbcJob() override = default; @@ -51,6 +53,7 @@ public: private: std::string outputFileName_; const std::map &progsInfo_; + uint8_t targetApiVersion_ = 0; }; class EmitCacheJob : public util::WorkerJob { diff --git a/es2panda/aot/main.cpp b/es2panda/aot/main.cpp index ecb6860511..ba63560380 100644 --- a/es2panda/aot/main.cpp +++ b/es2panda/aot/main.cpp @@ -185,6 +185,11 @@ int Run(int argc, const char **argv) return 0; } + if (options->CompilerOptions().supportedApi) { + panda::panda_file::PrintSupportedApi(); + return 0; + } + std::map programsInfo; size_t expectedProgsCount = options->CompilerOptions().sourceFiles.size(); panda::ArenaAllocator allocator(panda::SpaceType::SPACE_TYPE_COMPILER, nullptr, true); diff --git a/es2panda/aot/options.cpp b/es2panda/aot/options.cpp index ec8d03070c..f97e98bb63 100644 --- a/es2panda/aot/options.cpp +++ b/es2panda/aot/options.cpp @@ -226,6 +226,7 @@ bool Options::Parse(int argc, const char **argv) panda::PandArg opCacheFile("cache-file", "", "cache file for incremental compile"); panda::PandArg opNpmModuleEntryList("npm-module-entry-list", "", "entry list file for module compile"); panda::PandArg opMergeAbc("merge-abc", false, "Compile as merge abc"); + panda::PandArg opTargetApiVersion("target-api-version", 0, "Specify the target api version for compilation"); // hotfix && hotreload panda::PandArg opDumpSymbolTable("dump-symbol-table", "", "dump symbol table to file"); @@ -234,8 +235,10 @@ bool Options::Parse(int argc, const char **argv) panda::PandArg opHotReload("hot-reload", false, "compile as hot-reload mode"); // version - panda::PandArg bcVersion("bc-version", false, "Print ark bytecode version"); + panda::PandArg bcVersion("bc-version", false, "Print ark bytecode maximum supported version"); panda::PandArg bcMinVersion("bc-min-version", false, "Print ark bytecode minimum supported version"); + panda::PandArg supportedApi("supported-api", false, + "Print supported apis and corresponding bytecode versions"); // tail arguments panda::PandArg inputFile("input", "", "input file"); @@ -271,6 +274,7 @@ bool Options::Parse(int argc, const char **argv) argparser_->Add(&opCacheFile); argparser_->Add(&opNpmModuleEntryList); argparser_->Add(&opMergeAbc); + argparser_->Add(&opTargetApiVersion); argparser_->Add(&opDumpSymbolTable); argparser_->Add(&opInputSymbolTable); @@ -279,6 +283,7 @@ bool Options::Parse(int argc, const char **argv) argparser_->Add(&bcVersion); argparser_->Add(&bcMinVersion); + argparser_->Add(&supportedApi); argparser_->PushBackTail(&inputFile); argparser_->EnableTail(); @@ -286,9 +291,10 @@ bool Options::Parse(int argc, const char **argv) bool parseStatus = argparser_->Parse(argc, argv); - if (parseStatus && (bcVersion.GetValue() || bcMinVersion.GetValue())) { + if (parseStatus && (bcVersion.GetValue() || bcMinVersion.GetValue() || supportedApi.GetValue())) { compilerOptions_.bcVersion = bcVersion.GetValue(); compilerOptions_.bcMinVersion = bcMinVersion.GetValue(); + compilerOptions_.supportedApi = supportedApi.GetValue(); return true; } @@ -429,6 +435,8 @@ bool Options::Parse(int argc, const char **argv) options_ |= OptionFlags::SIZE_STAT; } + targetApiVersion_ = opTargetApiVersion.GetValue(); + compilerOptions_.dumpAsm = opDumpAssembly.GetValue(); compilerOptions_.dumpAst = opDumpAst.GetValue(); compilerOptions_.dumpTransformedAst = opDumpTransformedAst.GetValue(); @@ -448,6 +456,7 @@ bool Options::Parse(int argc, const char **argv) base64Output.GetValue()) ? 0 : opOptLevel.GetValue(); compilerOptions_.sourceFiles = sourceFiles_; compilerOptions_.mergeAbc = opMergeAbc.GetValue(); + compilerOptions_.targetApiVersion = targetApiVersion_; compilerOptions_.hotfixOptions.dumpSymbolTable = opDumpSymbolTable.GetValue(); compilerOptions_.hotfixOptions.symbolTable = opInputSymbolTable.GetValue(); diff --git a/es2panda/aot/options.h b/es2panda/aot/options.h index 00a2b7cf99..e2c7fe81cb 100644 --- a/es2panda/aot/options.h +++ b/es2panda/aot/options.h @@ -128,6 +128,13 @@ public: } bool CollectInputFilesFromFileList(const std::string &input, const std::string &inputExtension); + + int TargetApiVersion() const + { + return targetApiVersion_; + } + + bool CollectInputFilesFromFileList(const std::string &input); bool CollectInputFilesFromFileDirectory(const std::string &input, const std::string &extension); void ParseCacheFileOption(const std::string &cacheInput); @@ -149,6 +156,7 @@ private: std::string npmModuleEntryList_; std::vector sourceFiles_; std::unordered_map outputFiles_; + int targetApiVersion_ {0}; }; } // namespace panda::es2panda::aot diff --git a/es2panda/compiler/core/compileQueue.cpp b/es2panda/compiler/core/compileQueue.cpp index 48083b4c09..2808005a72 100644 --- a/es2panda/compiler/core/compileQueue.cpp +++ b/es2panda/compiler/core/compileQueue.cpp @@ -103,7 +103,9 @@ void CompileFileJob::Run() if (src_->scriptKind != parser::ScriptKind::COMMONJS && options_->optLevel != 0) { // common-js files has hidden parameters which cause optimizer abort, skip optimizing them. - util::Helpers::OptimizeProgram(prog, src_->fileName); + if (!util::Helpers::OptimizeProgram(prog, src_->fileName, options_->targetApiVersion)) { + return; + } } { diff --git a/es2panda/es2panda.h b/es2panda/es2panda.h index 28e8fbae68..1a2da20c11 100644 --- a/es2panda/es2panda.h +++ b/es2panda/es2panda.h @@ -93,6 +93,8 @@ struct CompilerOptions { bool bcVersion {false}; bool bcMinVersion {false}; std::unordered_map cacheFiles; + int targetApiVersion {0}; + bool supportedApi {false}; }; enum class ErrorType { diff --git a/es2panda/util/helpers.cpp b/es2panda/util/helpers.cpp index ee9c5277f7..c5ec35aad3 100644 --- a/es2panda/util/helpers.cpp +++ b/es2panda/util/helpers.cpp @@ -486,7 +486,7 @@ SignedNumberLiteral Helpers::GetSignedNumberLiteral(const ir::Expression *expr) return SignedNumberLiteral::UNRECOGNIZED; } -void Helpers::OptimizeProgram(panda::pandasm::Program *prog, const std::string &inputFile) +bool Helpers::OptimizeProgram(panda::pandasm::Program *prog, const std::string &inputFile, int targetApiVersion) { std::map stat; std::map *statp = &stat; @@ -507,12 +507,15 @@ void Helpers::OptimizeProgram(panda::pandasm::Program *prog, const std::string #endif const std::string outputSuffix = ".unopt.abc"; std::string tempOutput = panda::os::file::File::GetExtendedFilePath(inputFile + pid + outputSuffix); - if (panda::pandasm::AsmEmitter::Emit(tempOutput, *prog, statp, mapsp, true)) { + if (panda::pandasm::AsmEmitter::Emit(tempOutput, *prog, statp, mapsp, true, nullptr, targetApiVersion)) { panda::bytecodeopt::OptimizeBytecode(prog, mapsp, tempOutput, true, true); + } else { + return false; } std::remove(tempOutput.c_str()); #endif + return true; } bool Helpers::ReadFileToBuffer(const std::string &file, std::stringstream &ss) diff --git a/es2panda/util/helpers.h b/es2panda/util/helpers.h index 6ba2b9559d..ededa44d70 100644 --- a/es2panda/util/helpers.h +++ b/es2panda/util/helpers.h @@ -87,7 +87,7 @@ public: static bool IsObjectPropertyValue(const ArenaVector &properties, const ir::AstNode *ident); static SignedNumberLiteral GetSignedNumberLiteral(const ir::Expression *expr); - static void OptimizeProgram(panda::pandasm::Program *prog, const std::string &inputFile); + static bool OptimizeProgram(panda::pandasm::Program *prog, const std::string &inputFile, int targetApiVersion); template static T BaseName(T const &path, T const &delims = std::string(panda::os::file::File::GetPathDelim())); static bool ReadFileToBuffer(const std::string &file, std::stringstream &ss); diff --git a/merge_abc/src/main.cpp b/merge_abc/src/main.cpp index 6df5188f8f..b661d43885 100644 --- a/merge_abc/src/main.cpp +++ b/merge_abc/src/main.cpp @@ -80,8 +80,9 @@ int Run(int argc, const char **argv) std::string outputFileName = outputFilePath.append(panda::os::file::File::GetPathDelim()). append(options->outputFileName()); + auto targetApi = static_cast(options->TargetApiVersion()); if (!panda::pandasm::AsmEmitter::EmitPrograms(panda::os::file::File::GetExtendedFilePath(outputFileName), programs, - true)) { + true, targetApi)) { return 1; } diff --git a/merge_abc/src/options.cpp b/merge_abc/src/options.cpp index 0745e103d6..907fc91d6a 100644 --- a/merge_abc/src/options.cpp +++ b/merge_abc/src/options.cpp @@ -36,12 +36,14 @@ bool Options::Parse(int argc, const char **argv) panda::PandArg protoBinSuffix("suffix", "", "suffix of proto bin file"); panda::PandArg outputFileName("output", "", "name of merged panda file"); panda::PandArg outputFilePath("outputFilePath", "", "output path for merged panda file"); + panda::PandArg targetApiVersion("target-api-version", 0, "Specify the target api version for compilation"); argparser_->Add(&opHelp); argparser_->Add(&protoPathInput); argparser_->Add(&protoBinSuffix); argparser_->Add(&outputFileName); argparser_->Add(&outputFilePath); + argparser_->Add(&targetApiVersion); if (!argparser_->Parse(argc, argv) || opHelp.GetValue() || protoPathInput.GetValue().empty()) { std::stringstream ss; @@ -68,6 +70,9 @@ bool Options::Parse(int argc, const char **argv) if (!outputFilePath.GetValue().empty()) { outputFilePath_ = outputFilePath.GetValue(); } + if (targetApiVersion.GetValue()) { + targetApiVersion_ = targetApiVersion.GetValue(); + } return true; } diff --git a/merge_abc/src/options.h b/merge_abc/src/options.h index 8475ab1d20..be8c181e41 100644 --- a/merge_abc/src/options.h +++ b/merge_abc/src/options.h @@ -55,6 +55,10 @@ public: return errorMsg_; } + int TargetApiVersion() const + { + return targetApiVersion_; + } private: panda::PandArgParser *argparser_; std::string errorMsg_; @@ -62,6 +66,7 @@ private: std::string protoPathInput_; std::string outputFileName_ {"modules.abc"}; std::string outputFilePath_; + int targetApiVersion_ {0}; }; } // panda::proto #endif diff --git a/ts2panda/src/cmdOptions.ts b/ts2panda/src/cmdOptions.ts index ff02ad83b2..62c3e3d470 100644 --- a/ts2panda/src/cmdOptions.ts +++ b/ts2panda/src/cmdOptions.ts @@ -56,7 +56,8 @@ export const ts2pandaOptions = [ { name: 'output-proto', type: Boolean, defaultValue: false, description: "Output protoBin file. Default: false" }, { name: 'merge-abc', type: Boolean, defaultValue: false, description: "Compile as merge abc" }, { name: 'input-file', type: String, defaultValue: "", description: "A file containing a list of source files to be compiled. Each line of this file should be constructed in such format: fileName;recordName;moduleType;sourceFile;packageName" }, - { name: 'oh-modules', type: Boolean, defaultValue: false, description: "Set oh-modules as typescript compiler's package manager type. Default: false" } + { name: 'oh-modules', type: Boolean, defaultValue: false, description: "Set oh-modules as typescript compiler's package manager type. Default: false" }, + { name: 'target-api-version', type: Number, defaultValue: 0, description: "Specify the target api version for compilation" } ] @@ -376,6 +377,13 @@ export class CmdOptions { return this.options["oh-modules"] } + static getTargetApiVersion(): number { + if (!this.options) { + return 0; + } + return this.options["target-api-version"]; + } + // @ts-ignore static parseUserCmd(args: string[]): ts.ParsedCommandLine | undefined { this.options = commandLineArgs(ts2pandaOptions, { partial: true }); diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index ebd5130d63..22a8d5629a 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -253,7 +253,8 @@ export class Ts2Panda { "is_dts_file": isGlobalDeclare(), "output-proto": CmdOptions.isOutputproto(), "record_type": enableRecordType, - "input-file": CmdOptions.getCompileFilesList() + "input-file": CmdOptions.getCompileFilesList(), + "target-api-version": CmdOptions.getTargetApiVersion() }; let jsonOpt = JSON.stringify(options, null, 2); jsonOpt = "$" + jsonOpt.replace(dollarSign, '#$') + "$"; diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index d4a612e2a2..9035ac07c2 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -69,6 +69,7 @@ std::unordered_map g_opcodeMap = { #undef OPLIST {-1, panda::pandasm::Opcode::INVALID}, }; +int g_targetApiVersion = 0; // pandasm helpers static panda::pandasm::Record MakeRecordDefinition(const std::string &name) @@ -1034,6 +1035,13 @@ static void ParseCompilerOutputProto(const Json::Value &rootValue) } } +static void ParseTargetApiVersion(const Json::Value &rootValue) +{ + if (rootValue.isMember("target-api-version") && rootValue["target-api-version"].isInt()) { + g_targetApiVersion = rootValue["target-api-version"].asInt(); + } +} + static void ReplaceAllDistinct(std::string &str, const std::string &oldValue, const std::string &newValue) { for (std::string::size_type pos(0); pos != std::string::npos; pos += newValue.length()) { @@ -1060,6 +1068,7 @@ static void ParseOptions(const Json::Value &rootValue, panda::pandasm::Program & ParseIsDtsFile(rootValue); ParseEnableTypeInfo(rootValue); ParseCompilerOutputProto(rootValue); + ParseTargetApiVersion(rootValue); } static void ParseSingleFunc(const Json::Value &rootValue, panda::pandasm::Program &prog) @@ -1459,7 +1468,8 @@ static bool EmitProgram(const std::string &output, int optLevel, std::string opt panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps maps {}; panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps* mapsp = &maps; - if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, statp, mapsp, emitDebugInfo)) { + if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, statp, mapsp, emitDebugInfo, nullptr, + g_targetApiVersion)) { std::cerr << "Failed to emit binary data: " << panda::pandasm::AsmEmitter::GetLastError() << std::endl; return false; } @@ -1471,7 +1481,8 @@ static bool EmitProgram(const std::string &output, int optLevel, std::string opt return true; } - if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, statp, mapsp, emitDebugInfo)) { + if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, statp, mapsp, emitDebugInfo, nullptr, + g_targetApiVersion)) { std::cerr << "Failed to emit binary data: " << panda::pandasm::AsmEmitter::GetLastError() << std::endl; return false; } @@ -1483,7 +1494,8 @@ static bool EmitProgram(const std::string &output, int optLevel, std::string opt return true; } - if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, nullptr)) { + if (!panda::pandasm::AsmEmitter::Emit(convertedFilePath, prog, nullptr, nullptr, true, nullptr, + g_targetApiVersion)) { std::cerr << "Failed to emit binary data: " << panda::pandasm::AsmEmitter::GetLastError() << std::endl; return false; } @@ -1600,6 +1612,9 @@ bool GenerateProgram([[maybe_unused]] const std::string &data, const std::string std::string optLogLevel = options.GetOptLogLevelArg(); panda::pandasm::Program prog = panda::pandasm::Program(); prog.lang = panda::pandasm::extensions::Language::ECMASCRIPT; + if (options.WasSetTargetApiVersion()) { + g_targetApiVersion = options.GetTargetApiVersion(); + } if (isParsingFromPipe) { if (!ReadFromPipe(prog, options)) { diff --git a/ts2panda/ts2abc/ts2abc_options.h b/ts2panda/ts2abc/ts2abc_options.h index e08e66ac0a..d1687c6ddc 100755 --- a/ts2panda/ts2abc/ts2abc_options.h +++ b/ts2panda/ts2abc/ts2abc_options.h @@ -42,6 +42,7 @@ namespace panda::ts2abc { parser->Add(&compile_npm_entries_); parser->Add(&compiler_output_proto_); parser->Add(&multi_programs_pipe_); + parser->Add(&target_api_version_); parser->EnableTail(); parser->PushBackTail(&Tail_Arg1_arg_); parser->PushBackTail(&Tail_Arg2_arg_); @@ -187,6 +188,21 @@ namespace panda::ts2abc { return multi_programs_pipe_.GetValue(); } + int GetTargetApiVersion() const + { + return target_api_version_.GetValue(); + } + + void SetTargetApiVersion(int value) + { + target_api_version_.SetValue(value); + } + + bool WasSetTargetApiVersion() const + { + return target_api_version_.WasSet(); + } + std::string GetTailArg1() const { return Tail_Arg1_arg_.GetValue(); @@ -251,6 +267,8 @@ namespace panda::ts2abc { R"(Output protoBin file)"}; panda::PandArg multi_programs_pipe_{ "multi-programs-pipe", false, R"(Genrate programs by single pipe)"}; + panda::PandArg target_api_version_{ "target-api-version", 0, + R"(Specify the target api version for compilation)"}; panda::PandArg Tail_Arg1_arg_{ "ARG_1", "", R"(Path to input(json file) or path to output(ark bytecode)" " when 'compile-by-pipe' enabled)"}; -- Gitee