13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2021-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
183af6ab5fSopenharmony_ci#ifndef ES2PANDA_LEXER_KEYWORDS_H
193af6ab5fSopenharmony_ci#define ES2PANDA_LEXER_KEYWORDS_H
203af6ab5fSopenharmony_ci
213af6ab5fSopenharmony_ci#include "lexer/keywordsBase.h"
223af6ab5fSopenharmony_ci#include "utils/span.h"
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_ci// NOLINTBEGIN(readability-identifier-naming)
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_cinamespace ark::es2panda::lexer {
273af6ab5fSopenharmony_ci% token_type_prefix = 'TokenType::'
283af6ab5fSopenharmony_ci% Keywords::extensions.each do |extension_name, desc|
293af6ab5fSopenharmony_ci% class_name = extension_name.upcase + 'Keywords'
303af6ab5fSopenharmony_ciclass <%=class_name%> : public Keywords {
313af6ab5fSopenharmony_cipublic:
323af6ab5fSopenharmony_ci    explicit <%=class_name%>(Lexer* lexer, lexer::NextTokenFlags flags) : Keywords(lexer, flags) {}
333af6ab5fSopenharmony_ci    NO_COPY_SEMANTIC(<%=class_name%>);
343af6ab5fSopenharmony_ci    NO_MOVE_SEMANTIC(<%=class_name%>);
353af6ab5fSopenharmony_ci    ~<%=class_name%>() = default;
363af6ab5fSopenharmony_ci
373af6ab5fSopenharmony_ci    Span<const KeywordString> KeywordMap(char32_t cp) const override {
383af6ab5fSopenharmony_ci        switch(cp) {
393af6ab5fSopenharmony_ci%   desc['keyword_starts'].each do |cp|
403af6ab5fSopenharmony_ci        case '<%= cp %>': return Span<const KeywordString>(KEYWORDS_<%= cp %>);
413af6ab5fSopenharmony_ci%   end
423af6ab5fSopenharmony_ci        default: return Span<const KeywordString>();
433af6ab5fSopenharmony_ci        }
443af6ab5fSopenharmony_ci    }
453af6ab5fSopenharmony_ci
463af6ab5fSopenharmony_ci    void ScanKeyword(char32_t cp) override {
473af6ab5fSopenharmony_ci        ASSERT(cp >= 'a' && cp <= 'z');
483af6ab5fSopenharmony_ci        switch(cp) {
493af6ab5fSopenharmony_ci%   desc['all_word_starts'].each do |cp|
503af6ab5fSopenharmony_ci        case '<%=cp%>': Scan_<%=cp%>(); break;
513af6ab5fSopenharmony_ci%   end
523af6ab5fSopenharmony_ci        default: Util().ScanIdContinue(); break;
533af6ab5fSopenharmony_ci        }
543af6ab5fSopenharmony_ci    }
553af6ab5fSopenharmony_ci
563af6ab5fSopenharmony_ci    void HandlePotentialEscapedKeyword(const KeywordString& kws) const override {
573af6ab5fSopenharmony_ci        switch(kws.GetTokenType()) {
583af6ab5fSopenharmony_ci%   desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw|
593af6ab5fSopenharmony_ci        case <%=token_type_prefix + kw.token %>: Util().SetKeyword(Handle_<%=kw.name %>(Util(), "<%=kw.name %>", <%=token_type_prefix + kw.token %>)); return;
603af6ab5fSopenharmony_ci%   end
613af6ab5fSopenharmony_ci        default: if (Util().KeywordToIdent()) {
623af6ab5fSopenharmony_ci            return;
633af6ab5fSopenharmony_ci        }
643af6ab5fSopenharmony_ci        }
653af6ab5fSopenharmony_ci
663af6ab5fSopenharmony_ci        Util().ThrowEscapedKeyword();
673af6ab5fSopenharmony_ci    }
683af6ab5fSopenharmony_ci
693af6ab5fSopenharmony_ci%   desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw|
703af6ab5fSopenharmony_ci    // NOLINTNEXTLINE(readability-identifier-naming)
713af6ab5fSopenharmony_ci    static KeywordString Handle_<%= kw.name%>(const KeywordsUtil& util, std::string_view src, TokenType tokenType);
723af6ab5fSopenharmony_ci%   end
733af6ab5fSopenharmony_ci
743af6ab5fSopenharmony_ciprivate:
753af6ab5fSopenharmony_ci%   desc['keyword_starts'].each do |cp|
763af6ab5fSopenharmony_ci%     kws = desc['keywords'].select { |kw| kw.name[0] == cp }
773af6ab5fSopenharmony_ci    static constexpr std::array<const KeywordString, <%= kws.size %>> KEYWORDS_<%= cp %> = {{
783af6ab5fSopenharmony_ci%     kws.each do |kw|
793af6ab5fSopenharmony_ci        {"<%= kw.name%>", <%= token_type_prefix + kw.token %>},
803af6ab5fSopenharmony_ci%     end
813af6ab5fSopenharmony_ci    }};
823af6ab5fSopenharmony_ci%   end
833af6ab5fSopenharmony_ci
843af6ab5fSopenharmony_ci%   desc['tree'].each do |key, prefixes|
853af6ab5fSopenharmony_ci    inline void Scan_<%= key %>()
863af6ab5fSopenharmony_ci    {
873af6ab5fSopenharmony_ci        switch(Util().Iterator().Peek()) {
883af6ab5fSopenharmony_ci%   prefixes.select{|p| !p.nil? }.each do |prefix|
893af6ab5fSopenharmony_ci        case '<%=prefix%>': {
903af6ab5fSopenharmony_ci            Util().Iterator().Forward(1);
913af6ab5fSopenharmony_ci            Scan_<%= key%><%= prefix %>();
923af6ab5fSopenharmony_ci            return;
933af6ab5fSopenharmony_ci        }
943af6ab5fSopenharmony_ci%     end
953af6ab5fSopenharmony_ci%     if prefixes.include?(nil)
963af6ab5fSopenharmony_ci        default: {
973af6ab5fSopenharmony_ci            if (!KeywordsUtil::IsIdentifierPart(Util().Iterator().PeekCp())) {
983af6ab5fSopenharmony_ci%       kw_desc = desc['all_words'].find{ |x| x.name == key }
993af6ab5fSopenharmony_ci%       if kw_desc&.custom_handler&.include? extension_name
1003af6ab5fSopenharmony_ci                SetKeyword<Handle_<%=key%>>({"<%=key%>", <%= token_type_prefix + kw_desc.token%>});
1013af6ab5fSopenharmony_ci%       else
1023af6ab5fSopenharmony_ci%         token_type =kw_desc.token
1033af6ab5fSopenharmony_ci%         if kw_desc&.keyword_like&.include? extension_name
1043af6ab5fSopenharmony_ci%           token_type = 'LITERAL_IDENT'
1053af6ab5fSopenharmony_ci%         end
1063af6ab5fSopenharmony_ci                SetKeyword({"<%=key%>", <%=token_type_prefix + token_type%>, <%=token_type_prefix + kw_desc.token%>});
1073af6ab5fSopenharmony_ci%       end
1083af6ab5fSopenharmony_ci                return;
1093af6ab5fSopenharmony_ci            }
1103af6ab5fSopenharmony_ci            break;
1113af6ab5fSopenharmony_ci        }
1123af6ab5fSopenharmony_ci        }
1133af6ab5fSopenharmony_ci%     else
1143af6ab5fSopenharmony_ci        default: {
1153af6ab5fSopenharmony_ci            break;
1163af6ab5fSopenharmony_ci        }
1173af6ab5fSopenharmony_ci        }
1183af6ab5fSopenharmony_ci%     end
1193af6ab5fSopenharmony_ci%     if desc['keyword_starts'].include?(key[0])
1203af6ab5fSopenharmony_ci        Util().ScanIdContinueMaybeKeyword(this, Span<const KeywordString>(KEYWORDS_<%= key[0] %>));
1213af6ab5fSopenharmony_ci%     else
1223af6ab5fSopenharmony_ci        Util().ScanIdContinue();
1233af6ab5fSopenharmony_ci%     end
1243af6ab5fSopenharmony_ci    }
1253af6ab5fSopenharmony_ci
1263af6ab5fSopenharmony_ci%   end
1273af6ab5fSopenharmony_ci};
1283af6ab5fSopenharmony_ci% end
1293af6ab5fSopenharmony_ci} // namespace ark::es2panda::lexer
1303af6ab5fSopenharmony_ci
1313af6ab5fSopenharmony_ci// NOLINTEND(readability-identifier-naming)
1323af6ab5fSopenharmony_ci
1333af6ab5fSopenharmony_ci#endif
134