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
170namespace ark::es2panda::checker {
171class Checker;
172
173class SemanticAnalyzer {
174public:
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
193protected:
194    Checker *GetChecker() const
195    {
196        return checker_;
197    }
198
199private:
200    Checker *checker_;
201};
202}  // namespace ark::es2panda::checker
203
204#endif  // ES2PANDA_CHECKER_SEMANTICANALYZER_H
205