13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci// Autogenerated file -- DO NOT EDIT!
173af6ab5fSopenharmony_ci// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
183af6ab5fSopenharmony_ci// NOLINTBEGIN(readability-function-size, readability-magic-numbers)
193af6ab5fSopenharmony_ci
203af6ab5fSopenharmony_ci% Enums::enums&.each do |name, enum|
213af6ab5fSopenharmony_ci% if enum.flags&.length > 0
223af6ab5fSopenharmony_ciextern "C" __attribute__((unused)) <%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
233af6ab5fSopenharmony_ciend %>::<%= name %> E2pToIr<%= name %>(Es2panda<%= name %> e2pFlags)
243af6ab5fSopenharmony_ci{
253af6ab5fSopenharmony_ci% if enum.type == 'unsigned'
263af6ab5fSopenharmony_ci% if enum.flags.length <= 32 || enum.type == "int"
273af6ab5fSopenharmony_ci    auto irFlags = (<%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
283af6ab5fSopenharmony_ciend %>::<%= name %>)0U;
293af6ab5fSopenharmony_ci% enum.flags&.each do |flag|
303af6ab5fSopenharmony_ci    irFlags |= (e2pFlags & Es2panda<%= name %>::<%= enum.name_to_upper_snake %>_<%= flag %>) != 0 ? <%= enum.namespace %><%=
313af6ab5fSopenharmony_ci    if enum.parent_class_name then "::" + enum.parent_class_name
323af6ab5fSopenharmony_ciend %>::<%= name %>::<%= flag %> : (<%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
333af6ab5fSopenharmony_ciend %>::<%= name %>)0U;
343af6ab5fSopenharmony_ci% end
353af6ab5fSopenharmony_ci% else
363af6ab5fSopenharmony_ci    auto irFlags = (<%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
373af6ab5fSopenharmony_ciend %>::<%= name %>)0U;
383af6ab5fSopenharmony_ci% enum.flags&.each_with_index do |flag, index|
393af6ab5fSopenharmony_ci    irFlags |= (e2pFlags & <%= if index > 0 then "(uint64_t)1U << " +
403af6ab5fSopenharmony_ci    (index - 1).to_s + "U" else "(uint64_t)0U" end %>) != 0 ? <%=
413af6ab5fSopenharmony_ci    enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
423af6ab5fSopenharmony_ciend %>::<%= name %>::<%= flag %> : (<%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
433af6ab5fSopenharmony_ciend %>::<%= name %>)0U;
443af6ab5fSopenharmony_ci% end
453af6ab5fSopenharmony_ci% end
463af6ab5fSopenharmony_ci    return irFlags;
473af6ab5fSopenharmony_ci% else
483af6ab5fSopenharmony_ci    switch(e2pFlags)
493af6ab5fSopenharmony_ci    {
503af6ab5fSopenharmony_ci% enum.flags&.each do |flag|
513af6ab5fSopenharmony_ci    case Es2panda<%= name %>::<%= enum.name_to_upper_snake %>_<%= flag %>:
523af6ab5fSopenharmony_ci        return <%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
533af6ab5fSopenharmony_ciend %>::<%= name %>::<%= flag %>;
543af6ab5fSopenharmony_ci% end
553af6ab5fSopenharmony_ci    default:
563af6ab5fSopenharmony_ci        UNREACHABLE();
573af6ab5fSopenharmony_ci    }
583af6ab5fSopenharmony_ci%end
593af6ab5fSopenharmony_ci}
603af6ab5fSopenharmony_ci% end
613af6ab5fSopenharmony_ci
623af6ab5fSopenharmony_ci%end
633af6ab5fSopenharmony_ci
643af6ab5fSopenharmony_ci% Enums::enums&.each do |name, enum|
653af6ab5fSopenharmony_ci% if enum.flags&.length > 0
663af6ab5fSopenharmony_ciextern "C" __attribute__((unused)) Es2panda<%= name %> IrToE2p<%= name %>(<%=
673af6ab5fSopenharmony_cienum.namespace %><%= if enum.parent_class_name then
683af6ab5fSopenharmony_ci"::" + enum.parent_class_name end %>::<%= name %> irFlags)
693af6ab5fSopenharmony_ci{
703af6ab5fSopenharmony_ci% if enum.type == 'unsigned'
713af6ab5fSopenharmony_ci    Es2panda<%= name %> e2pFlags {(Es2panda<%= name %>)0U};
723af6ab5fSopenharmony_ci% if enum.flags.length <= 32 || enum.type == "int"
733af6ab5fSopenharmony_ci% enum.flags&.each do |flag|
743af6ab5fSopenharmony_ci    e2pFlags = static_cast<Es2panda<%= name %>>((irFlags & <%= enum.namespace %><%= if enum.parent_class_name then
753af6ab5fSopenharmony_ci    "::" + enum.parent_class_name end %>::<%= name %>::<%= flag
763af6ab5fSopenharmony_ci    %>) != 0 ? e2pFlags | Es2panda<%= name %>::<%= enum.name_to_upper_snake %>_<%= flag %> : e2pFlags);
773af6ab5fSopenharmony_ci% end
783af6ab5fSopenharmony_ci% else
793af6ab5fSopenharmony_ci% enum.flags&.each_with_index do |flag, index|
803af6ab5fSopenharmony_ci    e2pFlags = static_cast<Es2panda<%= name %>>((irFlags & <%= enum.namespace %><%= if enum.parent_class_name then
813af6ab5fSopenharmony_ci    "::" + enum.parent_class_name end %>::<%= name %>::<%= flag
823af6ab5fSopenharmony_ci    %>) != 0 ? e2pFlags | <%= if index > 0 then "(uint64_t)1U << " + (index - 1).to_s + "U"
833af6ab5fSopenharmony_ci    else "(uint64_t)0U" end %> : e2pFlags);
843af6ab5fSopenharmony_ci% end
853af6ab5fSopenharmony_ci% end
863af6ab5fSopenharmony_ci    return e2pFlags;
873af6ab5fSopenharmony_ci% else
883af6ab5fSopenharmony_ci    switch(irFlags)
893af6ab5fSopenharmony_ci    {
903af6ab5fSopenharmony_ci% enum.flags&.each do |flag|
913af6ab5fSopenharmony_ci    case <%= enum.namespace %><%= if enum.parent_class_name then "::" + enum.parent_class_name
923af6ab5fSopenharmony_ciend %>::<%= name %>::<%= flag %>:
933af6ab5fSopenharmony_ci        return Es2panda<%= name %>::<%= enum.name_to_upper_snake %>_<%= flag %>;
943af6ab5fSopenharmony_ci% end
953af6ab5fSopenharmony_ci    default:
963af6ab5fSopenharmony_ci        UNREACHABLE();
973af6ab5fSopenharmony_ci    }
983af6ab5fSopenharmony_ci% end
993af6ab5fSopenharmony_ci}
1003af6ab5fSopenharmony_ci%end
1013af6ab5fSopenharmony_ci
1023af6ab5fSopenharmony_ci% end
1033af6ab5fSopenharmony_ci
1043af6ab5fSopenharmony_ci// NOLINTEND(readability-function-size, readability-magic-numbers)
1053af6ab5fSopenharmony_ci
1063af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1073af6ab5fSopenharmony_ci#define IS(public_name, e2p_name)                                               \
1083af6ab5fSopenharmony_ci    extern "C" bool Is##public_name(es2panda_AstNode *ast)                  \
1093af6ab5fSopenharmony_ci    {                                                                           \
1103af6ab5fSopenharmony_ci        auto *node = reinterpret_cast<ir::AstNode *>(ast);                      \
1113af6ab5fSopenharmony_ci        return node->Is##e2p_name();                                            \
1123af6ab5fSopenharmony_ci    }
1133af6ab5fSopenharmony_ci
1143af6ab5fSopenharmony_ci% Es2pandaLibApi::ast_nodes&.each do |ast_node|
1153af6ab5fSopenharmony_ci% if ast_node != "AstNode" && ast_node != "TypeNode"
1163af6ab5fSopenharmony_ciIS(<%= ast_node %>, <%= ast_node %>)
1173af6ab5fSopenharmony_ci% end
1183af6ab5fSopenharmony_ci% end
1193af6ab5fSopenharmony_ci
1203af6ab5fSopenharmony_ci#undef IS
1213af6ab5fSopenharmony_ci
1223af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1233af6ab5fSopenharmony_ci#define IS(public_name, e2p_name)                                               \
1243af6ab5fSopenharmony_ci    extern "C" bool ScopeIs##public_name(es2panda_Scope *scope)                 \
1253af6ab5fSopenharmony_ci    {                                                                           \
1263af6ab5fSopenharmony_ci        auto *e2p_scope = reinterpret_cast<varbinder::Scope *>(scope);          \
1273af6ab5fSopenharmony_ci        return e2p_scope->Is##e2p_name();                                       \
1283af6ab5fSopenharmony_ci    }
1293af6ab5fSopenharmony_ci
1303af6ab5fSopenharmony_ci% Es2pandaLibApi::scopes&.each do |scope|
1313af6ab5fSopenharmony_ci% if scope != "Scope"
1323af6ab5fSopenharmony_ciIS(<%= scope %>, <%= scope %>)
1333af6ab5fSopenharmony_ci% end
1343af6ab5fSopenharmony_ci% end
1353af6ab5fSopenharmony_ci
1363af6ab5fSopenharmony_ci#undef IS
1373af6ab5fSopenharmony_ci
1383af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1393af6ab5fSopenharmony_ci#define IS(public_name, e2p_name)                                               \
1403af6ab5fSopenharmony_ci    extern "C" bool TypeIs##public_name(es2panda_Type *type)                    \
1413af6ab5fSopenharmony_ci    {                                                                           \
1423af6ab5fSopenharmony_ci        auto *e2p_type = reinterpret_cast<checker::Type *>(type);               \
1433af6ab5fSopenharmony_ci        return e2p_type->Is##e2p_name();                                        \
1443af6ab5fSopenharmony_ci    }
1453af6ab5fSopenharmony_ci
1463af6ab5fSopenharmony_ci% Es2pandaLibApi::ast_types&.each do |type|
1473af6ab5fSopenharmony_ci% if type != "Type"
1483af6ab5fSopenharmony_ciIS(<%= type %>, <%= type %>)
1493af6ab5fSopenharmony_ci% end
1503af6ab5fSopenharmony_ci% end
1513af6ab5fSopenharmony_ci
1523af6ab5fSopenharmony_ci#undef IS
1533af6ab5fSopenharmony_ci
1543af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1553af6ab5fSopenharmony_ci#define IS(public_name, e2p_name)                                               \
1563af6ab5fSopenharmony_ci    extern "C" bool VariableIs##public_name(es2panda_Variable *variable)        \
1573af6ab5fSopenharmony_ci    {                                                                           \
1583af6ab5fSopenharmony_ci        auto *e2p_variable = reinterpret_cast<varbinder::Variable *>(variable); \
1593af6ab5fSopenharmony_ci        return e2p_variable->Is##e2p_name();                                    \
1603af6ab5fSopenharmony_ci    }
1613af6ab5fSopenharmony_ci
1623af6ab5fSopenharmony_ci% Es2pandaLibApi::ast_variables&.each do |variable|
1633af6ab5fSopenharmony_ci% if variable[1] != "Variable"
1643af6ab5fSopenharmony_ciIS(<%= variable[1] %>, <%= variable[1] %>)
1653af6ab5fSopenharmony_ci% end
1663af6ab5fSopenharmony_ci% end
1673af6ab5fSopenharmony_ci
1683af6ab5fSopenharmony_ci#undef IS
1693af6ab5fSopenharmony_ci
1703af6ab5fSopenharmony_ci// NOLINTNEXTLINE(readability-function-size)
1713af6ab5fSopenharmony_cichar const *AstNodeName(es2panda_AstNode *ast)
1723af6ab5fSopenharmony_ci{
1733af6ab5fSopenharmony_ci% Es2pandaLibApi::ast_nodes&.each do |ast_node|
1743af6ab5fSopenharmony_ci% unless ["AstNode", "Expression", "Statement", "TypeNode"].include?(ast_node)
1753af6ab5fSopenharmony_ci    if(Is<%= ast_node %>(ast)) {
1763af6ab5fSopenharmony_ci        return "<%= ast_node %>";
1773af6ab5fSopenharmony_ci    }
1783af6ab5fSopenharmony_ci% end
1793af6ab5fSopenharmony_ci% end
1803af6ab5fSopenharmony_ci    if(IsExpression(ast)) {
1813af6ab5fSopenharmony_ci        return "Expression";
1823af6ab5fSopenharmony_ci    }
1833af6ab5fSopenharmony_ci    if(IsStatement(ast)) {
1843af6ab5fSopenharmony_ci        return "Statement";
1853af6ab5fSopenharmony_ci    }
1863af6ab5fSopenharmony_ci    return "Unknown AstNode";
1873af6ab5fSopenharmony_ci}
1883af6ab5fSopenharmony_ci
1893af6ab5fSopenharmony_ci% Es2pandaLibApi::classes&.each do |className, classData|
1903af6ab5fSopenharmony_ci
1913af6ab5fSopenharmony_ci% classData.class_constructors&.each_with_index do |constructor, index|
1923af6ab5fSopenharmony_ci/* <%= constructor["raw_decl"] %> */
1933af6ab5fSopenharmony_ciextern "C" <%= classData.constructor_type().lib_type_to_str()
1943af6ab5fSopenharmony_ci%>Create<%= className + "#{index}"
1953af6ab5fSopenharmony_ci%>([[maybe_unused]] es2panda_Context *context
1963af6ab5fSopenharmony_ci<%= constructor["args"]&.map { |arg|  if arg.lib_args_to_str.strip() != "" then
1973af6ab5fSopenharmony_ci", " + "[[maybe_unused]] " + arg.lib_args_to_str end }&.join("") %>)
1983af6ab5fSopenharmony_ci{
1993af6ab5fSopenharmony_ci% constructor["args"]&.each do |arg|
2003af6ab5fSopenharmony_ci    <%= arg.lib_cast["expression"] %>
2013af6ab5fSopenharmony_ci% end
2023af6ab5fSopenharmony_ci    auto *ctx = reinterpret_cast<Context *>(context);
2033af6ab5fSopenharmony_ci    auto *ctxAllocator = ctx->allocator;
2043af6ab5fSopenharmony_ci    return reinterpret_cast<<%= classData.constructor_type().lib_type_to_str()
2053af6ab5fSopenharmony_ci    %>>(<%= classData.constructor_cast["start"]
2063af6ab5fSopenharmony_ci    %><%= constructor["args"]&.map { |arg| arg.lib_cast["var_name"] }&.join(", ") %>)<%=
2073af6ab5fSopenharmony_ci        classData.constructor_cast["end"] %>;
2083af6ab5fSopenharmony_ci}
2093af6ab5fSopenharmony_ci
2103af6ab5fSopenharmony_ci% if classData.updater_allowed()
2113af6ab5fSopenharmony_ci
2123af6ab5fSopenharmony_ci/* Updater */
2133af6ab5fSopenharmony_ciextern "C" <%= classData.constructor_type().lib_type_to_str()
2143af6ab5fSopenharmony_ci%>Update<%= className + "#{index}"
2153af6ab5fSopenharmony_ci%>([[maybe_unused]] es2panda_Context *context, es2panda_AstNode *original
2163af6ab5fSopenharmony_ci<%= constructor["args"]&.map { |arg|  if arg.lib_args_to_str.strip() != "" then
2173af6ab5fSopenharmony_ci", " + "[[maybe_unused]] " + arg.lib_args_to_str end }&.join("") %>)
2183af6ab5fSopenharmony_ci{
2193af6ab5fSopenharmony_ci% constructor["args"]&.each do |arg|
2203af6ab5fSopenharmony_ci    <%= arg.lib_cast["expression"] %>
2213af6ab5fSopenharmony_ci% end
2223af6ab5fSopenharmony_ci    auto *ctx = reinterpret_cast<Context *>(context);
2233af6ab5fSopenharmony_ci    auto *ctxAllocator = ctx->allocator;
2243af6ab5fSopenharmony_ci    auto newE2pNode =  <%= classData.constructor_cast["start"]
2253af6ab5fSopenharmony_ci    %><%= constructor["args"]&.map { |arg| arg.lib_cast["var_name"] }&.join(", ") %><%=
2263af6ab5fSopenharmony_ci        classData.constructor_cast["end"] %>;
2273af6ab5fSopenharmony_ci    newE2pNode->SetOriginalNode(reinterpret_cast<ir::AstNode *>(original));
2283af6ab5fSopenharmony_ci    return reinterpret_cast<<%= classData.constructor_type().lib_type_to_str()
2293af6ab5fSopenharmony_ci    %>>(newE2pNode);
2303af6ab5fSopenharmony_ci}
2313af6ab5fSopenharmony_ci
2323af6ab5fSopenharmony_ci%end    # updater end
2333af6ab5fSopenharmony_ci
2343af6ab5fSopenharmony_ci% end   # constructors end
2353af6ab5fSopenharmony_ci////
2363af6ab5fSopenharmony_ci
2373af6ab5fSopenharmony_ci% classData.class_methods&.each_with_index do |method_info, index|
2383af6ab5fSopenharmony_ci/* <%= method_info["raw_decl"] %> */
2393af6ab5fSopenharmony_ciextern "C" <%= method_info["const"] %> <%=
2403af6ab5fSopenharmony_cimethod_info["return_type"].lib_type_to_str %><%= className + method_info["overload_name"] %>(
2413af6ab5fSopenharmony_ci[[maybe_unused]] es2panda_Context *context<%= if classData.call_cast["call_var"]
2423af6ab5fSopenharmony_cithen ", " + classData.call_cast["call_var"] end %><%=
2433af6ab5fSopenharmony_cimethod_info["args"]&.map { |arg| if arg.lib_args_to_str.strip() != "" then
2443af6ab5fSopenharmony_ci", " + "[[maybe_unused]] " + arg.lib_args_to_str end}&.join("") %>/*return_args:*/<%= method_info["return_arg_to_str"] %>)
2453af6ab5fSopenharmony_ci{
2463af6ab5fSopenharmony_ci% method_info["args"]&.each do |arg|
2473af6ab5fSopenharmony_ci    <%= arg.lib_cast["expression"] %>
2483af6ab5fSopenharmony_ci% end
2493af6ab5fSopenharmony_ci    <%= method_info["return_expr"] %>
2503af6ab5fSopenharmony_ci}
2513af6ab5fSopenharmony_ci
2523af6ab5fSopenharmony_ci% end   # methods end
2533af6ab5fSopenharmony_ci
2543af6ab5fSopenharmony_ci
2553af6ab5fSopenharmony_ci% end   # classes end
2563af6ab5fSopenharmony_ci
2573af6ab5fSopenharmony_ci% Es2pandaLibApi::print_stats
2583af6ab5fSopenharmony_ci
2593af6ab5fSopenharmony_ci// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
260