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_IR_EXPRESSION_IDENTIFIER_H
17 #define ES2PANDA_IR_EXPRESSION_IDENTIFIER_H
18 
19 #include <ir/expression.h>
20 #include <util/ustring.h>
21 
22 namespace panda::es2panda::compiler {
23 class PandaGen;
24 }  // namespace panda::es2panda::compiler
25 
26 namespace panda::es2panda::checker {
27 class Checker;
28 class Type;
29 }  // namespace panda::es2panda::checker
30 
31 namespace panda::es2panda::binder {
32 class Variable;
33 }  // namespace panda::es2panda::binder
34 
35 namespace panda::es2panda::ir {
36 
37 enum class IdentifierFlags : uint8_t {
38     NONE,
39     OPTIONAL = 1 << 0,
40     REFERENCE = 1 << 1,
41     TDZ = 1 << 2,
42 };
43 
44 DEFINE_BITOPS(IdentifierFlags)
45 
46 class Identifier : public Expression {
47 public:
Identifier(util::StringView name)48     explicit Identifier(util::StringView name)
49         : Expression(AstNodeType::IDENTIFIER), name_(name)
50     {
51     }
52 
Identifier(util::StringView name, Expression *typeAnnotation)53     explicit Identifier(util::StringView name, Expression *typeAnnotation)
54         : Expression(AstNodeType::IDENTIFIER),
55           name_(name),
56           typeAnnotation_(typeAnnotation)
57     {
58     }
59 
TypeAnnotation() const60     const Expression *TypeAnnotation() const
61     {
62         return typeAnnotation_;
63     }
64 
TypeAnnotation()65     Expression *TypeAnnotation()
66     {
67         return typeAnnotation_;
68     }
69 
Name() const70     const util::StringView &Name() const
71     {
72         return name_;
73     }
74 
SetName(util::StringView name)75     void SetName(util::StringView name)
76     {
77         name_ = name;
78     }
79 
IsOptional() const80     bool IsOptional() const
81     {
82         return (flags_ & IdentifierFlags::OPTIONAL) != 0;
83     }
84 
SetOptional(bool optional)85     void SetOptional(bool optional)
86     {
87         if (optional) {
88             flags_ |= IdentifierFlags::OPTIONAL;
89         } else {
90             flags_ &= ~IdentifierFlags::OPTIONAL;
91         }
92     }
93 
IsReference() const94     bool IsReference() const
95     {
96         return (flags_ & IdentifierFlags::REFERENCE) != 0;
97     }
98 
SetReference()99     void SetReference()
100     {
101         flags_ |= IdentifierFlags::REFERENCE;
102     }
103 
TSVariables() const104     const std::vector<binder::Variable *> &TSVariables() const
105     {
106         return tsVariables_;
107     }
108 
SetTSVariables(const std::vector<binder::Variable *> &tsVariables)109     void SetTSVariables(const std::vector<binder::Variable *> &tsVariables)
110     {
111         tsVariables_ = tsVariables;
112     }
113 
IsTdz() const114     bool IsTdz() const
115     {
116         return (flags_ & IdentifierFlags::TDZ) != 0;
117     }
118 
SetTdz()119     void SetTdz()
120     {
121         flags_ |= IdentifierFlags::TDZ;
122     }
123 
124     void SetTsTypeAnnotation(Expression *typeAnnotation) override
125     {
126         typeAnnotation_ = typeAnnotation;
127     }
128 
129     void Iterate(const NodeTraverser &cb) const override;
130     void Dump(ir::AstDumper *dumper) const override;
131     void Compile(compiler::PandaGen *pg) const override;
132     checker::Type *Check(checker::Checker *checker) const override;
133     void UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override;
134 
135 private:
136     util::StringView name_;
137     Expression *typeAnnotation_ {};
138     IdentifierFlags flags_ {IdentifierFlags::NONE};
139     std::vector<binder::Variable *> tsVariables_;
140 };
141 
142 }  // namespace panda::es2panda::ir
143 
144 #endif
145