1/** 2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16// Autogenerated file -- DO NOT EDIT! 17 18#ifndef ES2PANDA_COMPILER_GEN_SIGNATURES_H 19#define ES2PANDA_COMPILER_GEN_SIGNATURES_H 20 21#include "util/ustring.h" 22#include "util/language.h" 23 24#include <optional> 25 26namespace ark::es2panda::compiler { 27class Signatures { 28public: 29 explicit Signatures() = delete; 30 31 // Defines 32% Signatures::DEFINES.each do |ref, define| 33% if define.comment 34 static constexpr std::string_view <%= ref %> = "<%= define.name %>"; // <%= define.comment %> 35% else 36 static constexpr std::string_view <%= ref %> = "<%= define.name %>"; 37% end 38% end 39 40 // Primitive types 41% Signatures::PRIMITIVES.each do |ref, name| 42 static constexpr std::string_view <%= ref %> = "<%= name %>"; 43% end 44 45 // TypeDescriptor primitives 46% Signatures::TYPEDESCRIPTORS.each do |ref, name| 47 static constexpr std::string_view <%= ref %> = "<%= name %>"; 48% end 49 50 // Builtin classes 51% Signatures::BUILTINS.each do |ref, desc| 52 static constexpr std::string_view <%= ref %>_CLASS = "<%= desc[1] %>"; 53% end 54 55 // Builtins 56% Signatures::BUILTINS.each do |ref, desc| 57 static constexpr std::string_view <%= ref %> = "<%= desc[0] %>"; 58% end 59 60 // Builtin signatures 61% Signatures::SIGNATURES.each do |ref, name| 62 static constexpr std::string_view <%= ref %> = "<%= name %>"; 63% end 64 65 class Dynamic { 66 public: 67 static bool IsSupported([[maybe_unused]] Language lang) 68 { 69% Signatures::DYNAMIC.each do |lang, data| 70 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 71 return true; // NOLINT(readability-simplify-boolean-expr) 72 } 73% end 74 return false; 75 } 76 77 static std::string_view Type(Language lang) 78 { 79 ASSERT(IsSupported(lang)); 80% Signatures::DYNAMIC.each do |lang, data| 81 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 82 return <%= data.dynamic_class %>; 83 } 84% end 85 UNREACHABLE(); 86 } 87 88 static std::string_view CallClass(Language lang) 89 { 90 ASSERT(IsSupported(lang)); 91% Signatures::DYNAMIC.each do |lang, data| 92 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 93 return <%= data.call_class.name %>; 94 } 95% end 96 UNREACHABLE(); 97 } 98 99 static std::string_view InitCallClassBuiltin(Language lang) 100 { 101 ASSERT(IsSupported(lang)); 102% Signatures::DYNAMIC.each do |lang, data| 103 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 104 return <%= data.call_class.init_builtin %>; 105 } 106% end 107 UNREACHABLE(); 108 } 109 110 static std::string_view NewClass(Language lang) 111 { 112 ASSERT(IsSupported(lang)); 113% Signatures::DYNAMIC.each do |lang, data| 114 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 115 return <%= data.new_class.name %>; 116 } 117% end 118 UNREACHABLE(); 119 } 120 121 static std::string_view InitNewClassBuiltin(Language lang) 122 { 123 ASSERT(IsSupported(lang)); 124% Signatures::DYNAMIC.each do |lang, data| 125 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 126 return <%= data.new_class.init_builtin %>; 127 } 128% end 129 UNREACHABLE(); 130 } 131 132 static std::string_view LoadModuleBuiltin(Language lang) 133 { 134 ASSERT(IsSupported(lang)); 135% Signatures::DYNAMIC.each do |lang, data| 136 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 137 return <%= data.module_class.load_builtin %>; 138 } 139% end 140 UNREACHABLE(); 141 } 142 143 static std::optional<Language> LanguageFromType(std::string_view assemblerName) 144 { 145% Signatures::DYNAMIC.each do |lang, data| 146 if (assemblerName == <%= data.dynamic_class %>) { 147 return Language(Language::Id::<%= lang.upcase %>); 148 } 149% end 150 return {}; 151 } 152 153 static std::string_view GetUndefinedBuiltin(Language lang) 154 { 155 ASSERT(IsSupported(lang)); 156% Signatures::DYNAMIC.each do |lang, data| 157 if (lang.GetId() == Language::Id::<%= lang.upcase %>) { 158 return <%= data.builtins.get_undefined %>; 159 } 160% end 161 UNREACHABLE(); 162 } 163 164% def generate(attr, pref) 165% builtins = Hash.new() 166% Signatures::DYNAMIC.each do |lang, data| 167% data.builtins[attr].each do |builtin_data| 168% builtins[builtin_data.type] = [] unless builtins.key?(builtin_data.type) 169% builtins[builtin_data.type].append([lang, builtin_data.builtin]) 170% end 171% end 172% res = '' 173% builtins.each do |type, data| 174% res += "\n" 175% res += " static std::string_view #{pref}#{type.capitalize}Builtin(Language lang)\n" 176% res += " {\n" 177% data.each do |builtin_data| 178% (lang, builtin) = builtin_data 179% res += " if (lang.GetId() == Language::Id::#{lang.upcase}) {\n" 180% res += " return #{builtin};\n" 181% res += " }\n" 182% end 183% res += " UNREACHABLE();\n" 184% res += " }" 185% end 186% res 187% end 188<%= generate(:new, 'New') %> 189<%= generate(:get_value, 'Get') %> 190<%= generate(:get_property, 'GetProperty') %> 191<%= generate(:set_property, 'SetProperty') %> 192<%= generate(:get_element, 'GetElement') %> 193<%= generate(:set_element, 'SetElement') %> 194 195 }; 196}; 197} // namespace ark::es2panda::compiler 198 199#endif 200