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 #ifndef ES2PANDA_CHECKER_SEMANTICANALYZER_H
17 #define ES2PANDA_CHECKER_SEMANTICANALYZER_H
18 
19 #include "compiler/core/dynamicContext.h"
20 #include "ir/opaqueTypeNode.h"
21 #include "ir/as/namedType.h"
22 #include "ir/as/prefixAssertionExpression.h"
23 #include "ir/base/catchClause.h"
24 #include "ir/base/classDefinition.h"
25 #include "ir/base/classProperty.h"
26 #include "ir/base/classStaticBlock.h"
27 #include "ir/base/decorator.h"
28 #include "ir/base/metaProperty.h"
29 #include "ir/base/methodDefinition.h"
30 #include "ir/base/property.h"
31 #include "ir/base/scriptFunction.h"
32 #include "ir/base/spreadElement.h"
33 #include "ir/base/templateElement.h"
34 #include "ir/base/tsIndexSignature.h"
35 #include "ir/base/tsMethodSignature.h"
36 #include "ir/base/tsPropertySignature.h"
37 #include "ir/base/tsSignatureDeclaration.h"
38 #include "ir/ets/etsClassLiteral.h"
39 #include "ir/ets/etsFunctionType.h"
40 #include "ir/ets/etsImportDeclaration.h"
41 #include "ir/ets/etsLaunchExpression.h"
42 #include "ir/ets/etsNewArrayInstanceExpression.h"
43 #include "ir/ets/etsNewClassInstanceExpression.h"
44 #include "ir/ets/etsNewMultiDimArrayInstanceExpression.h"
45 #include "ir/ets/etsPackageDeclaration.h"
46 #include "ir/ets/etsParameterExpression.h"
47 #include "ir/ets/etsPrimitiveType.h"
48 #include "ir/ets/etsScript.h"
49 #include "ir/ets/etsStringLiteralType.h"
50 #include "ir/ets/etsStructDeclaration.h"
51 #include "ir/ets/etsTypeReference.h"
52 #include "ir/ets/etsTypeReferencePart.h"
53 #include "ir/ets/etsWildcardType.h"
54 #include "ir/expressions/arrayExpression.h"
55 #include "ir/expressions/arrowFunctionExpression.h"
56 #include "ir/expressions/assignmentExpression.h"
57 #include "ir/expressions/awaitExpression.h"
58 #include "ir/expressions/binaryExpression.h"
59 #include "ir/expressions/blockExpression.h"
60 #include "ir/expressions/callExpression.h"
61 #include "ir/expressions/chainExpression.h"
62 #include "ir/expressions/classExpression.h"
63 #include "ir/expressions/conditionalExpression.h"
64 #include "ir/expressions/directEvalExpression.h"
65 #include "ir/expressions/functionExpression.h"
66 #include "ir/expressions/identifier.h"
67 #include "ir/expressions/importExpression.h"
68 #include "ir/expressions/memberExpression.h"
69 #include "ir/expressions/newExpression.h"
70 #include "ir/expressions/objectExpression.h"
71 #include "ir/expressions/omittedExpression.h"
72 #include "ir/expressions/sequenceExpression.h"
73 #include "ir/expressions/superExpression.h"
74 #include "ir/expressions/taggedTemplateExpression.h"
75 #include "ir/expressions/templateLiteral.h"
76 #include "ir/expressions/thisExpression.h"
77 #include "ir/expressions/typeofExpression.h"
78 #include "ir/expressions/unaryExpression.h"
79 #include "ir/expressions/updateExpression.h"
80 #include "ir/expressions/yieldExpression.h"
81 #include "ir/expressions/literals/bigIntLiteral.h"
82 #include "ir/expressions/literals/booleanLiteral.h"
83 #include "ir/expressions/literals/charLiteral.h"
84 #include "ir/expressions/literals/nullLiteral.h"
85 #include "ir/expressions/literals/numberLiteral.h"
86 #include "ir/expressions/literals/regExpLiteral.h"
87 #include "ir/expressions/literals/stringLiteral.h"
88 #include "ir/module/exportAllDeclaration.h"
89 #include "ir/module/exportDefaultDeclaration.h"
90 #include "ir/module/exportNamedDeclaration.h"
91 #include "ir/module/exportSpecifier.h"
92 #include "ir/module/importDeclaration.h"
93 #include "ir/module/importDefaultSpecifier.h"
94 #include "ir/module/importNamespaceSpecifier.h"
95 #include "ir/module/importSpecifier.h"
96 #include "ir/statements/assertStatement.h"
97 #include "ir/statements/blockStatement.h"
98 #include "ir/statements/breakStatement.h"
99 #include "ir/statements/classDeclaration.h"
100 #include "ir/statements/continueStatement.h"
101 #include "ir/statements/debuggerStatement.h"
102 #include "ir/statements/doWhileStatement.h"
103 #include "ir/statements/emptyStatement.h"
104 #include "ir/statements/expressionStatement.h"
105 #include "ir/statements/forInStatement.h"
106 #include "ir/statements/forOfStatement.h"
107 #include "ir/statements/forUpdateStatement.h"
108 #include "ir/statements/functionDeclaration.h"
109 #include "ir/statements/ifStatement.h"
110 #include "ir/statements/labelledStatement.h"
111 #include "ir/statements/returnStatement.h"
112 #include "ir/statements/switchCaseStatement.h"
113 #include "ir/statements/switchStatement.h"
114 #include "ir/statements/throwStatement.h"
115 #include "ir/statements/tryStatement.h"
116 #include "ir/statements/variableDeclaration.h"
117 #include "ir/statements/variableDeclarator.h"
118 #include "ir/statements/whileStatement.h"
119 #include "ir/ts/tsAnyKeyword.h"
120 #include "ir/ts/tsArrayType.h"
121 #include "ir/ts/tsAsExpression.h"
122 #include "ir/ts/tsBigintKeyword.h"
123 #include "ir/ts/tsBooleanKeyword.h"
124 #include "ir/ts/tsClassImplements.h"
125 #include "ir/ts/tsConditionalType.h"
126 #include "ir/ts/tsConstructorType.h"
127 #include "ir/ts/tsEnumDeclaration.h"
128 #include "ir/ts/tsEnumMember.h"
129 #include "ir/ts/tsExternalModuleReference.h"
130 #include "ir/ts/tsFunctionType.h"
131 #include "ir/ts/tsImportEqualsDeclaration.h"
132 #include "ir/ts/tsImportType.h"
133 #include "ir/ts/tsIndexedAccessType.h"
134 #include "ir/ts/tsInferType.h"
135 #include "ir/ts/tsInterfaceBody.h"
136 #include "ir/ts/tsInterfaceDeclaration.h"
137 #include "ir/ts/tsInterfaceHeritage.h"
138 #include "ir/ts/tsIntersectionType.h"
139 #include "ir/ts/tsLiteralType.h"
140 #include "ir/ts/tsMappedType.h"
141 #include "ir/ts/tsModuleBlock.h"
142 #include "ir/ts/tsModuleDeclaration.h"
143 #include "ir/ts/tsNamedTupleMember.h"
144 #include "ir/ts/tsNeverKeyword.h"
145 #include "ir/ts/tsNonNullExpression.h"
146 #include "ir/ts/tsNullKeyword.h"
147 #include "ir/ts/tsNumberKeyword.h"
148 #include "ir/ts/tsObjectKeyword.h"
149 #include "ir/ts/tsParameterProperty.h"
150 #include "ir/ts/tsParenthesizedType.h"
151 #include "ir/ts/tsQualifiedName.h"
152 #include "ir/ts/tsStringKeyword.h"
153 #include "ir/ts/tsThisType.h"
154 #include "ir/ts/tsTupleType.h"
155 #include "ir/ts/tsTypeAliasDeclaration.h"
156 #include "ir/ts/tsTypeAssertion.h"
157 #include "ir/ts/tsTypeLiteral.h"
158 #include "ir/ts/tsTypeOperator.h"
159 #include "ir/ts/tsTypeParameterDeclaration.h"
160 #include "ir/ts/tsTypeParameter.h"
161 #include "ir/ts/tsTypeParameterInstantiation.h"
162 #include "ir/ts/tsTypePredicate.h"
163 #include "ir/ts/tsTypeQuery.h"
164 #include "ir/ts/tsTypeReference.h"
165 #include "ir/ts/tsUndefinedKeyword.h"
166 #include "ir/ts/tsUnionType.h"
167 #include "ir/ts/tsUnknownKeyword.h"
168 #include "ir/ts/tsVoidKeyword.h"
169 
170 namespace ark::es2panda::checker {
171 class Checker;
172 
173 class SemanticAnalyzer {
174 public:
SemanticAnalyzer(Checker *checker)175     explicit SemanticAnalyzer(Checker *checker)
176     {
177         checker_ = checker;
178     }
179     virtual ~SemanticAnalyzer() = default;
180     NO_COPY_SEMANTIC(SemanticAnalyzer);
181     NO_MOVE_SEMANTIC(SemanticAnalyzer);
182 
183 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
184 #define DECLARE_AST_NODE_CHECK_METHOD(_, nodeType) virtual checker::Type *Check(ir::nodeType *node) const = 0;
185     AST_NODE_MAPPING(DECLARE_AST_NODE_CHECK_METHOD)
186 #undef DECLARE_AST_NODE_CHECK_METHOD
187 
188 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
189 #define DECLARE_AST_NODE_CHECK_METHOD(_, __, nodeType, ___) virtual checker::Type *Check(ir::nodeType *node) const = 0;
190     AST_NODE_REINTERPRET_MAPPING(DECLARE_AST_NODE_CHECK_METHOD)
191 #undef DECLARE_AST_NODE_CHECK_METHOD
192 
193 protected:
GetChecker() const194     Checker *GetChecker() const
195     {
196         return checker_;
197     }
198 
199 private:
200     Checker *checker_;
201 };
202 }  // namespace ark::es2panda::checker
203 
204 #endif  // ES2PANDA_CHECKER_SEMANTICANALYZER_H
205