• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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