• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * Copyright (c) 2021 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_LEXER_KEYWORDS_H
19#define ES2PANDA_LEXER_KEYWORDS_H
20
21#include "lexer/keywordsBase.h"
22#include "utils/span.h"
23
24// NOLINTBEGIN(readability-identifier-naming)
25
26namespace panda::es2panda::lexer {
27% token_type_prefix = 'TokenType::'
28% Keywords::extensions.each do |extension_name, desc|
29% class_name = extension_name.upcase + 'Keywords'
30class <%=class_name%> : public Keywords {
31public:
32    explicit <%=class_name%>(Lexer* lexer, lexer::NextTokenFlags flags) : Keywords(lexer, flags) {}
33    NO_COPY_SEMANTIC(<%=class_name%>);
34    NO_MOVE_SEMANTIC(<%=class_name%>);
35    ~<%=class_name%>() = default;
36
37    Span<const KeywordString> KeywordMap(char32_t cp) const override {
38        switch(cp) {
39%   desc['keyword_starts'].each do |cp|
40        case '<%= cp %>': return Span<const KeywordString>(KEYWORDS_<%= cp %>);
41%   end
42        default: return Span<const KeywordString>();
43        }
44    }
45
46    void ScanKeyword(char32_t cp) override {
47        ASSERT(cp >= 'a' && cp <= 'z');
48        switch(cp) {
49%   desc['all_word_starts'].each do |cp|
50        case '<%=cp%>': Scan_<%=cp%>(); break;
51%   end
52        default: Util().ScanIdContinue(); break;
53        }
54    }
55
56    void HandlePotentialEscapedKeyword(const KeywordString& kws) const override {
57        switch(kws.GetTokenType()) {
58%   desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw|
59        case <%=token_type_prefix + kw.token %>: Util().SetKeyword(Handle_<%=kw.name %>(Util(), "<%=kw.name %>", <%=token_type_prefix + kw.token %>)); return;
60%   end
61        default: if (Util().KeywordToIdent()) {
62            return;
63        }
64        }
65
66        Util().ThrowEscapedKeyword();
67    }
68
69%   desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw|
70    // NOLINTNEXTLINE(readability-identifier-naming)
71    static KeywordString Handle_<%= kw.name%>(const KeywordsUtil& util, std::string_view src, TokenType tokenType);
72%   end
73
74private:
75%   desc['keyword_starts'].each do |cp|
76%     kws = desc['keywords'].select { |kw| kw.name[0] == cp }
77    static constexpr std::array<const KeywordString, <%= kws.size %>> KEYWORDS_<%= cp %> = {{
78%     kws.each do |kw|
79        {"<%= kw.name%>", <%= token_type_prefix + kw.token %>},
80%     end
81    }};
82%   end
83
84%   desc['tree'].each do |key, prefixes|
85    inline void Scan_<%= key %>()
86    {
87        switch(Util().Iterator().Peek()) {
88%   prefixes.select{|p| !p.nil? }.each do |prefix|
89        case '<%=prefix%>': {
90            Util().Iterator().Forward(1);
91            Scan_<%= key%><%= prefix %>();
92            return;
93        }
94%     end
95%     if prefixes.include?(nil)
96        default: {
97            if (!KeywordsUtil::IsIdentifierPart(Util().Iterator().PeekCp())) {
98%       kw_desc = desc['all_words'].find{ |x| x.name == key }
99%       if kw_desc&.custom_handler&.include? extension_name
100                SetKeyword<Handle_<%=key%>>({"<%=key%>", <%= token_type_prefix + kw_desc.token%>});
101%       else
102%         token_type =kw_desc.token
103%         if kw_desc&.keyword_like&.include? extension_name
104%           token_type = 'LITERAL_IDENT'
105%         end
106                SetKeyword({"<%=key%>", <%=token_type_prefix + token_type%>, <%=token_type_prefix + kw_desc.token%>});
107%       end
108                return;
109            }
110            break;
111        }
112        }
113%     else
114        default: {
115            break;
116        }
117        }
118%     end
119%     if desc['keyword_starts'].include?(key[0])
120        Util().ScanIdContinueMaybeKeyword(this, Span<const KeywordString>(KEYWORDS_<%= key[0] %>));
121%     else
122        Util().ScanIdContinue();
123%     end
124    }
125
126%   end
127};
128% end
129} // namespace panda::es2panda::lexer
130
131// NOLINTEND(readability-identifier-naming)
132
133#endif
134