• 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 #ifndef ES2PANDA_PARSER_CORE_PARSER_PRIVATE_CONTEXT_H
17 #define ES2PANDA_PARSER_CORE_PARSER_PRIVATE_CONTEXT_H
18 
19 #include <macros.h>
20 #include <parser/program/program.h>
21 #include <util/enumbitops.h>
22 #include <util/ustring.h>
23 
24 #include <vector>
25 
26 namespace panda::es2panda::parser {
27 enum class ParserStatus {
28     NO_OPTS = 0,
29     STRICT = (1 << 0),
30 
31     FUNCTION = (1 << 1),
32     ARROW_FUNCTION = (1 << 2),
33     GENERATOR_FUNCTION = (1 << 3),
34     ASYNC_FUNCTION = (1 << 4),
35     CONSTRUCTOR_FUNCTION = (1 << 5),
36     FUNCTION_PARAM = (1 << 6),
37     IS_SPREAD = (1 << 7),
38     ACCESSOR_FUNCTION = (1 << 8),
39     FUNCTION_DECLARATION = (1 << 9),
40 
41     ALLOW_SUPER = (1 << 10),
42     ALLOW_SUPER_CALL = (1 << 11),
43 
44     DISALLOW_AWAIT = (1 << 12),
45     ALLOW_YIELD = (1 << 13),
46     IN_ITERATION = (1 << 14),
47     IN_LABELED = (1 << 15),
48 
49     EXPORT_REACHED = (1 << 16),
50     HAS_COMPLEX_PARAM = (1 << 17),
51     IN_SWITCH = (1 << 18),
52 
53     MODULE = (1 << 19),
54     ALLOW_NEW_TARGET = (1 << 20),
55 
56     IN_EXTENDS = (1 << 21),
57     ALLOW_THIS_TYPE = (1 << 22),
58     IN_METHOD_DEFINITION = (1 << 23),
59     IN_AMBIENT_CONTEXT = (1 << 24),
60     IN_CLASS_BODY = (1 << 25),
61     IN_DECORATOR = (1 << 26),
62     DISALLOW_CONTINUE = (1 << 27),
63 
64     TS_MODULE = (1 << 28),
65     DISALLOW_CONDITIONAL_TYPES = (1 << 29),
66     STATIC_BLOCK = (1 << 30),
67     DISALLOW_ARGUMENTS = (1 << 31),
68 };
69 
DEFINE_BITOPS(ParserStatus)70 DEFINE_BITOPS(ParserStatus)
71 
72 class ParserContext {
73 public:
74     explicit ParserContext(const Program *program) : program_(program) {}
75     explicit ParserContext(ParserContext *current, ParserStatus newStatus, util::StringView label = "")
76         : program_(current->program_), prev_(current), label_(label)
77     {
78         ParserStatus currentStatus = current->status_;
79         currentStatus &= (ParserStatus::MODULE | ParserStatus::ALLOW_NEW_TARGET | ParserStatus::IN_EXTENDS |
80                           ParserStatus::ALLOW_THIS_TYPE | ParserStatus::IN_CLASS_BODY | ParserStatus::FUNCTION);
81         status_ = currentStatus | newStatus;
82     }
83 
84     DEFAULT_COPY_SEMANTIC(ParserContext);
85     DEFAULT_MOVE_SEMANTIC(ParserContext);
86     ~ParserContext() = default;
87 
88     const Program *GetProgram() const
89     {
90         return program_;
91     }
92 
93     ParserContext *Prev() const
94     {
95         return prev_;
96     }
97 
98     const ParserStatus &Status() const
99     {
100         return status_;
101     }
102 
103     ParserStatus &Status()
104     {
105         return status_;
106     }
107 
108     bool IsGenerator() const
109     {
110         return (status_ & ParserStatus::GENERATOR_FUNCTION) != 0;
111     }
112 
113     bool AllowYield() const
114     {
115         return (status_ & ParserStatus::ALLOW_YIELD) != 0;
116     }
117 
118     bool DisallowAwait() const
119     {
120         return (status_ & ParserStatus::DISALLOW_AWAIT) != 0;
121     }
122 
123     bool IsAsync() const
124     {
125         return (status_ & ParserStatus::ASYNC_FUNCTION) != 0;
126     }
127 
128     bool IsModule() const
129     {
130         return (status_ & ParserStatus::MODULE) != 0;
131     }
132 
133     bool IsTsModule() const
134     {
135         return (status_ & ParserStatus::TS_MODULE) != 0;
136     }
137 
138     bool IsStaticBlock() const
139     {
140         return (status_ & ParserStatus::STATIC_BLOCK) != 0;
141     }
142 
143     bool DisallowArguments() const
144     {
145         return (status_ & ParserStatus::DISALLOW_ARGUMENTS) != 0;
146     }
147 
148     const ParserContext *FindLabel(const util::StringView &label) const;
149 
150 private:
151     const Program *program_;
152     ParserContext *prev_ {};
153     ParserStatus status_ {};
154     util::StringView label_ {};
155 };
156 }  // namespace panda::es2panda::parser
157 
158 #endif
159