• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_LIB
17 #define ES2PANDA_LIB
18 
19 // Switch off the linter for C header
20 // NOLINTBEGIN
21 
22 #include <stdbool.h>
23 #include <stddef.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #define ES2PANDA_LIB_VERSION 1
30 
31 typedef struct es2panda_Config es2panda_Config;
32 typedef struct es2panda_Context es2panda_Context;
33 
34 typedef struct es2panda_Program es2panda_Program;
35 typedef struct es2panda_ExternalSource es2panda_ExternalSource;
36 typedef struct es2panda_AstNode es2panda_AstNode;
37 typedef struct es2panda_Type es2panda_Type;
38 typedef struct es2panda_Variable es2panda_Variable;
39 typedef struct es2panda_Scope es2panda_Scope;
40 
41 enum es2panda_ContextState {
42     ES2PANDA_STATE_NEW,
43     ES2PANDA_STATE_PARSED,
44     ES2PANDA_STATE_SCOPE_INITED,
45     ES2PANDA_STATE_CHECKED,
46     ES2PANDA_STATE_LOWERED,
47     ES2PANDA_STATE_ASM_GENERATED,
48     ES2PANDA_STATE_BIN_GENERATED,
49 
50     ES2PANDA_STATE_ERROR
51 };
52 typedef enum es2panda_ContextState es2panda_ContextState;
53 
54 // NB: has to be synchronized with astNode.h
55 enum es2panda_ModifierFlags {
56     ES2PANDA_MODIFIER_NONE = 0U,
57     ES2PANDA_MODIFIER_STATIC = 1U << 0U,
58     ES2PANDA_MODIFIER_ASYNC = 1U << 1U,
59     ES2PANDA_MODIFIER_PUBLIC = 1U << 2U,
60     ES2PANDA_MODIFIER_PROTECTED = 1U << 3U,
61     ES2PANDA_MODIFIER_PRIVATE = 1U << 4U,
62     ES2PANDA_MODIFIER_DECLARE = 1U << 5U,
63     ES2PANDA_MODIFIER_READONLY = 1U << 6U,
64     ES2PANDA_MODIFIER_OPTIONAL = 1U << 7U,
65     ES2PANDA_MODIFIER_DEFINITE = 1U << 8U,
66     ES2PANDA_MODIFIER_ABSTRACT = 1U << 9U,
67     ES2PANDA_MODIFIER_CONST = 1U << 10U,
68     ES2PANDA_MODIFIER_FINAL = 1U << 11U,
69     ES2PANDA_MODIFIER_NATIVE = 1U << 12U,
70     ES2PANDA_MODIFIER_OVERRIDE = 1U << 13U,
71     ES2PANDA_MODIFIER_CONSTRUCTOR = 1U << 14U,
72     ES2PANDA_MODIFIER_SYNCHRONIZED = 1U << 15U,
73     ES2PANDA_MODIFIER_FUNCTIONAL = 1U << 16U,
74     ES2PANDA_MODIFIER_IN = 1U << 17U,
75     ES2PANDA_MODIFIER_OUT = 1U << 18U,
76     ES2PANDA_MODIFIER_INTERNAL = 1U << 19U,
77     ES2PANDA_MODIFIER_EXPORT = 1U << 22U,
78     ES2PANDA_MODIFIER_SETTER = 1U << 23U,
79     ES2PANDA_MODIFIER_DEFAULT_EXPORT = 1U << 24U,
80 };
81 typedef enum es2panda_ModifierFlags es2panda_ModifierFlags;
82 
83 // Has to be synchronized with astNode.h
84 enum es2panda_ScriptFunctionFlags {
85     ES2PANDA_SCRIPT_FUNCTION_NONE = 0,
86     ES2PANDA_SCRIPT_FUNCTION_GENERATOR = 1U << 0U,
87     ES2PANDA_SCRIPT_FUNCTION_ASYNC = 1U << 1U,
88     ES2PANDA_SCRIPT_FUNCTION_ARROW = 1U << 2U,
89     ES2PANDA_SCRIPT_FUNCTION_EXPRESSION = 1U << 3U,
90     ES2PANDA_SCRIPT_FUNCTION_OVERLOAD = 1U << 4U,
91     ES2PANDA_SCRIPT_FUNCTION_CONSTRUCTOR = 1U << 5U,
92     ES2PANDA_SCRIPT_FUNCTION_METHOD = 1U << 6U,
93     ES2PANDA_SCRIPT_FUNCTION_STATIC_BLOCK = 1U << 7U,
94     ES2PANDA_SCRIPT_FUNCTION_HIDDEN = 1U << 8U,
95     ES2PANDA_SCRIPT_FUNCTION_IMPLICIT_SUPER_CALL_NEEDED = 1U << 9U,
96     ES2PANDA_SCRIPT_FUNCTION_ENUM = 1U << 10U,
97     ES2PANDA_SCRIPT_FUNCTION_EXTERNAL = 1U << 11U,
98     ES2PANDA_SCRIPT_FUNCTION_PROXY = 1U << 12U,
99     ES2PANDA_SCRIPT_FUNCTION_THROWS = 1U << 13U,
100     ES2PANDA_SCRIPT_FUNCTION_RETHROWS = 1U << 14U,
101     ES2PANDA_SCRIPT_FUNCTION_GETTER = 1U << 15U,
102     ES2PANDA_SCRIPT_FUNCTION_SETTER = 1U << 16U,
103     ES2PANDA_SCRIPT_FUNCTION_ENTRY_POINT = 1U << 17U,
104     ES2PANDA_SCRIPT_FUNCTION_INSTANCE_EXTENSION_METHOD = 1U << 18U,
105     ES2PANDA_SCRIPT_FUNCTION_HAS_RETURN = 1U << 19U
106 };
107 typedef enum es2panda_ScriptFunctionFlags es2panda_ScriptFunctionFlags;
108 
109 // Needs to be synchronized with memberExpression.h
110 enum es2panda_MemberExpressionKind {
111     ES2PANDA_MEMBER_EXPRESSION_KIND_NONE = 0,
112     ES2PANDA_MEMBER_EXPRESSION_KIND_ELEMENT_ACCESS = 1U << 0U,
113     ES2PANDA_MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS = 1U << 1U,
114     ES2PANDA_MEMBER_EXPRESSION_KIND_GETTER = 1U << 2U,
115     ES2PANDA_MEMBER_EXPRESSION_KIND_SETTER = 1U << 3U
116 };
117 typedef enum es2panda_MemberExpressionKind es2panda_MemberExpressionKind;
118 
119 struct es2panda_Impl {
120     int version;
121 
122     es2panda_Config *(*CreateConfig)(int argc, char const **argv);
123     void (*DestroyConfig)(es2panda_Config *config);
124 
125     es2panda_Context *(*CreateContextFromFile)(es2panda_Config *config, char const *source_file_name);
126     es2panda_Context *(*CreateContextFromString)(es2panda_Config *config, char const *source, char const *file_name);
127     es2panda_Context *(*ProceedToState)(es2panda_Context *context, es2panda_ContextState state);  // context is consumed
128     void (*DestroyContext)(es2panda_Context *context);
129 
130     es2panda_ContextState (*ContextState)(es2panda_Context *context);
131     char const *(*ContextErrorMessage)(es2panda_Context *context);
132 
133     es2panda_Program *(*ContextProgram)(es2panda_Context *context);
134     es2panda_AstNode *(*ProgramAst)(es2panda_Program *program);
135     es2panda_ExternalSource **(*ProgramExternalSources)(es2panda_Program *program, size_t *len_p);
136     char const *(*ExternalSourceName)(es2panda_ExternalSource *e_source);
137     es2panda_Program **(*ExternalSourcePrograms)(es2panda_ExternalSource *e_source, size_t *len_p);
138 
139     es2panda_Type *(*AstNodeType)(es2panda_AstNode *ast);
140     void (*AstNodeSetType)(es2panda_AstNode *ast, es2panda_Type *type);
141 
142     es2panda_AstNode *const *(*AstNodeDecorators)(es2panda_AstNode *ast, size_t *size_p);
143     void (*AstNodeSetDecorators)(es2panda_Context *context, es2panda_AstNode *ast, es2panda_AstNode **decorators,
144                                  size_t n_decorators);
145 
146     es2panda_ModifierFlags (*AstNodeModifierFlags)(es2panda_AstNode *ast);
147 
148     void (*AstNodeForEach)(es2panda_AstNode *ast, void (*func)(es2panda_AstNode *, void *), void *arg);
149 
150     bool (*IsArrowFunctionExpression)(es2panda_AstNode *ast);
151     es2panda_AstNode *(*CreateArrowFunctionExpression)(es2panda_Context *context, es2panda_AstNode *script_function);
152     es2panda_AstNode *(*ArrowFunctionExpressionScriptFunction)(es2panda_AstNode *ast);
153 
154     bool (*IsAsExpression)(es2panda_AstNode *ast);
155     es2panda_AstNode *(*CreateAsExpression)(es2panda_Context *context, es2panda_AstNode *expr,
156                                             es2panda_AstNode *type_annotation, bool is_const);
157     es2panda_AstNode *(*AsExpressionExpr)(es2panda_AstNode *ast);
158     es2panda_AstNode *(*AsExpressionTypeAnnotation)(es2panda_AstNode *ast);
159     bool (*AsExpressionIsConst)(es2panda_AstNode *ast);
160     void (*AsExpressionSetExpr)(es2panda_AstNode *ast, es2panda_AstNode *expr);
161     void (*AsExpressionSetTypeAnnotation)(es2panda_AstNode *ast, es2panda_AstNode *type_annotation);
162 
163     bool (*IsAssignmentExpression)(es2panda_AstNode *ast);
164     es2panda_AstNode *(*CreateAssignmentExpression)(es2panda_Context *context, es2panda_AstNode *left,
165                                                     es2panda_AstNode *right, char const *operator_type);
166     es2panda_AstNode *(*AssignmentExpressionLeft)(es2panda_AstNode *ast);
167     es2panda_AstNode *(*AssignmentExpressionRight)(es2panda_AstNode *ast);
168     char const *(*AssignmentExpressionOperatorType)(es2panda_AstNode *ast);
169     void (*AssignmentExpressionSetOperatorType)(es2panda_AstNode *ast, char const *operator_type);
170 
171     bool (*IsBinaryExpression)(es2panda_AstNode *ast);
172     es2panda_AstNode *(*CreatebinaryExpression)(es2panda_Context *context, es2panda_AstNode *left,
173                                                 es2panda_AstNode *right, char const *operator_type);
174     es2panda_AstNode *(*BinaryExpressionLeft)(es2panda_AstNode *ast);
175     es2panda_AstNode *(*BinaryExpressionRight)(es2panda_AstNode *ast);
176     char const *(*BinaryExpressionOperator)(es2panda_AstNode *ast);
177     void (*BinaryExpressionSetOperator)(es2panda_AstNode *ast, char const *operator_type);
178 
179     bool (*IsBlockStatement)(es2panda_AstNode *ast);
180     es2panda_AstNode *(*CreateBlockStatement)(es2panda_Context *context);
181     es2panda_AstNode **(*BlockStatementStatements)(es2panda_AstNode *ast, size_t *size_p);
182     void (*BlockStatementAddStatement)(es2panda_AstNode *ast, es2panda_AstNode *statement);
183 
184     bool (*IsCallExpression)(es2panda_AstNode *ast);
185     es2panda_AstNode *(*CreateCallExpression)(es2panda_Context *context, es2panda_AstNode *callee,
186                                               es2panda_AstNode *type_arguments, es2panda_AstNode **arguments,
187                                               size_t n_arguments, bool optional);
188     es2panda_AstNode const *(*CallExpressionCallee)(es2panda_AstNode *ast);
189     es2panda_AstNode const *(*CallExpressionTypeArguments)(es2panda_AstNode *ast);
190     es2panda_AstNode **(*CallExpressionArguments)(es2panda_AstNode *ast, size_t *size_p);
191     bool (*CallExpressionIsOptional)(es2panda_AstNode *ast);
192     void (*CallExpressionSetTypeArguments)(es2panda_AstNode *ast, es2panda_AstNode *type_arguments);
193 
194     bool (*IsChainExpression)(es2panda_AstNode *ast);
195     es2panda_AstNode *(*CreateChainExpression)(es2panda_Context *context, es2panda_AstNode *child);
196     es2panda_AstNode const *(*ChainExpressionChild)(es2panda_AstNode *ast);
197 
198     bool (*IsClassDeclaration)(es2panda_AstNode *ast);
199     es2panda_AstNode *(*CreateClassDeclaration)(es2panda_Context *context, es2panda_AstNode *definition);
200     es2panda_AstNode *(*ClassDeclarationDefinition)(es2panda_AstNode *ast);
201 
202     bool (*IsClassDefinition)(es2panda_AstNode *ast);
203     es2panda_AstNode *(*CreateClassDefinition)(es2panda_Context *context, es2panda_AstNode *identifier,
204                                                es2panda_ModifierFlags flags);
205     es2panda_AstNode *(*ClassDefinitionIdentifier)(es2panda_AstNode *ast);
206     es2panda_AstNode *(*ClassDefinitionTypeParameters)(es2panda_AstNode *ast);
207     es2panda_AstNode *(*ClassDefinitionSuperClass)(es2panda_AstNode *ast);
208     es2panda_AstNode **(*ClassDefinitionImplements)(es2panda_AstNode *ast, size_t *size_p);
209     es2panda_AstNode *(*ClassDefinitionConstructor)(es2panda_AstNode *ast);
210     es2panda_AstNode **(*ClassDefinitionBody)(es2panda_AstNode *ast, size_t *size_p);
211     void (*ClassDefinitionSetIdentifier)(es2panda_AstNode *ast, es2panda_AstNode *identifier);
212     void (*ClassDefinitionSetTypeParameters)(es2panda_AstNode *ast, es2panda_AstNode *type_params);
213     void (*ClassDefinitionSetSuperClass)(es2panda_AstNode *ast, es2panda_AstNode *super_class);
214     void (*ClassDefinitionSetImplements)(es2panda_AstNode *ast, es2panda_AstNode **implements, size_t n_implements);
215     void (*ClassDefinitionAddImplements)(es2panda_AstNode *ast, es2panda_AstNode *implements);
216     void (*ClassDefinitionSetConstructor)(es2panda_AstNode *ast, es2panda_AstNode *constructor);
217     void (*ClassDefinitonSetBody)(es2panda_AstNode *ast, es2panda_AstNode **body, size_t n_elems);
218     void (*ClassDefinitonAddToBody)(es2panda_AstNode *ast, es2panda_AstNode *statement);
219 
220     es2panda_AstNode *(*ClassElementKey)(es2panda_AstNode *ast);
221     es2panda_AstNode *(*ClassElementValue)(es2panda_AstNode *ast);
222 
223     bool (*IsClassImplementsClause)(es2panda_AstNode *ast);
224     es2panda_AstNode *(*CreateClassImplementsClause)(es2panda_Context *context, es2panda_AstNode *expression,
225                                                      es2panda_AstNode *type_arguments);
226     es2panda_AstNode *(*ClassImplementsClauseExpression)(es2panda_AstNode *ast);
227     es2panda_AstNode const *(*ClassImplementsClauseTypeArguments)(es2panda_AstNode *ast);
228 
229     bool (*IsClassProperty)(es2panda_AstNode *ast);
230     es2panda_AstNode *(*CreateClassProperty)(es2panda_Context *context, es2panda_AstNode *key, es2panda_AstNode *value,
231                                              es2panda_AstNode *type_annotation, es2panda_ModifierFlags modifier_flags,
232                                              bool is_computed);
233     es2panda_AstNode *(*ClassPropertyTypeAnnotation)(es2panda_AstNode *ast);
234 
235     bool (*IsExpressionStatement)(es2panda_AstNode *ast);
236     es2panda_AstNode *(*CreateExpressionStatement)(es2panda_Context *context, es2panda_AstNode *expression);
237     es2panda_AstNode *(*ExpressionStatementExpression)(es2panda_AstNode *ast);
238 
239     bool (*IsFunctionDeclaration)(es2panda_AstNode *ast);
240     es2panda_AstNode *(*CreateFunctionDeclaration)(es2panda_Context *context, es2panda_AstNode *function);
241     es2panda_AstNode *(*FunctionDeclarationFunction)(es2panda_AstNode *ast);
242 
243     bool (*IsFunctionExpression)(es2panda_AstNode *ast);
244     es2panda_AstNode *(*CreateFunctionExpression)(es2panda_Context *context, es2panda_AstNode *function);
245     es2panda_AstNode *(*FunctionExpressionFunction)(es2panda_AstNode *ast);
246 
247     bool (*IsFunctionTypeNode)(es2panda_AstNode *ast);
248     es2panda_AstNode *(*CreateFunctionTypeNode)(es2panda_Context *context, es2panda_AstNode *type_params,
249                                                 es2panda_AstNode **params, size_t n_params,
250                                                 es2panda_AstNode *return_type, es2panda_ScriptFunctionFlags func_flags);
251     es2panda_AstNode const *(*FunctionTypeNodeTypeParams)(es2panda_AstNode *ast);
252     es2panda_AstNode *const *(*FunctionTypeNodeParams)(es2panda_AstNode *ast, size_t *size_p);
253     es2panda_AstNode *(*FunctionTypeNodeReturnType)(es2panda_AstNode *ast);
254     es2panda_ScriptFunctionFlags (*FunctionTypeNodeFlags)(es2panda_AstNode *ast);
255 
256     bool (*IsIdentifier)(es2panda_AstNode *ast);
257     es2panda_AstNode *(*CreateIdentifier)(es2panda_Context *context, char const *name,
258                                           es2panda_AstNode *type_annotation);
259     char const *(*IdentifierName)(es2panda_Context *context, es2panda_AstNode *identifier);
260     es2panda_AstNode *(*IdentifierTypeAnnotation)(es2panda_AstNode *identifier);
261     es2panda_Variable *(*IdentifierVariable)(es2panda_AstNode *identifier);
262     void (*IdentifierSetVariable)(es2panda_AstNode *identifier, es2panda_Variable *variable);
263 
264     bool (*IsIfStatement)(es2panda_AstNode *ast);
265     es2panda_AstNode *(*CreateIfStatement)(es2panda_Context *context, es2panda_AstNode *test,
266                                            es2panda_AstNode *consequent, es2panda_AstNode *alternate);
267     es2panda_AstNode const *(*IfStatementTest)(es2panda_AstNode *ast);
268     es2panda_AstNode const *(*IfStatementConsequent)(es2panda_AstNode *ast);
269     es2panda_AstNode const *(*IfStatementAlternate)(es2panda_AstNode *ast);
270 
271     bool (*IsImportDeclaration)(es2panda_AstNode *ast);
272     es2panda_AstNode *(*CreateImportDeclaration)(es2panda_Context *context, es2panda_AstNode *source,
273                                                  es2panda_AstNode **specifiers, size_t n_specifiers);
274     es2panda_AstNode const *(*ImportDeclarationSource)(es2panda_AstNode *ast);
275     es2panda_AstNode *const *(*ImportDeclarationSpecifiers)(es2panda_AstNode *ast, size_t *size_p);
276 
277     bool (*IsImportExpression)(es2panda_AstNode *ast);
278     es2panda_AstNode *(*CreateImportExpression)(es2panda_Context *context, es2panda_AstNode *source);
279     es2panda_AstNode *(*ImportExpressionSource)(es2panda_AstNode *ast);
280 
281     bool (*IsImportSpecifier)(es2panda_AstNode *ast);
282     es2panda_AstNode *(*CreateImportSpecifier)(es2panda_Context *context, es2panda_AstNode *imported,
283                                                es2panda_AstNode *local);
284     es2panda_AstNode *(*ImportSpecifierImported)(es2panda_AstNode *ast);
285     es2panda_AstNode *(*ImportSpecifierLocal)(es2panda_AstNode *ast);
286 
287     bool (*IsMemberExpression)(es2panda_AstNode *ast);
288     es2panda_AstNode *(*CreateMemberExpression)(es2panda_Context *context, es2panda_AstNode *object,
289                                                 es2panda_AstNode *property, es2panda_MemberExpressionKind kind,
290                                                 bool is_computed, bool is_optional);
291     es2panda_AstNode *(*MemberExpressionObject)(es2panda_AstNode *ast);
292     es2panda_AstNode *(*MemberExpressionProperty)(es2panda_AstNode *ast);
293     es2panda_MemberExpressionKind (*MemberExpressionKind)(es2panda_AstNode *ast);
294     bool (*MemberExpressionIsComputed)(es2panda_AstNode *ast);
295     bool (*MemberExpressionIsOptional)(es2panda_AstNode *ast);
296 
297     bool (*IsMethodDefinition)(es2panda_AstNode *ast);
298     es2panda_AstNode *(*CreateMethodDefinition)(es2panda_Context *context, char const *kind, es2panda_AstNode *key,
299                                                 es2panda_AstNode *value, es2panda_ModifierFlags modifiers,
300                                                 bool is_computed);
301     char const *(*MethodDefinitionKind)(es2panda_AstNode *ast);
302     es2panda_AstNode const *(*MethodDefinitionKey)(es2panda_AstNode *ast);
303     es2panda_AstNode const *(*MethodDefinitionValue)(es2panda_AstNode *ast);
304     es2panda_ModifierFlags (*MethodDefinitionModifiers)(es2panda_AstNode *ast);
305     bool (*MethodDefinitionIsComputed)(es2panda_AstNode *ast);
306     es2panda_AstNode *const *(*MethodDefinitionOverloads)(es2panda_AstNode *ast, size_t *size_p);
307     void (*MethodDefinitionSetOverloads)(es2panda_AstNode *ast, es2panda_AstNode **overloads, size_t n_overloads);
308     void (*MethodDefinitionAddOverload)(es2panda_AstNode *ast, es2panda_AstNode *overload);
309 
310     bool (*IsNewClassInstanceExpression)(es2panda_AstNode *ast);
311     es2panda_AstNode *(*CreateNewClassInstanceExpression)(es2panda_Context *context, es2panda_AstNode *type_reference,
312                                                           es2panda_AstNode **arguments, size_t n_arguments,
313                                                           es2panda_AstNode *class_definition);
314     es2panda_AstNode *(*NewClassInstanceExpressionTypeReference)(es2panda_AstNode *ast);
315     es2panda_AstNode *const *(*NewClassInstanceExpressionArguments)(es2panda_AstNode *ast, size_t *size_p);
316     es2panda_AstNode *(*NewClassInstanceExpressionClassDefinition)(es2panda_AstNode *ast);
317 
318     bool (*IsNewArrayInstanceExpression)(es2panda_AstNode *ast);
319     es2panda_AstNode *(*CreateNewArrayInstanceExpression)(es2panda_Context *context, es2panda_AstNode *type_reference,
320                                                           es2panda_AstNode *dimension);
321     es2panda_AstNode *(*NewArrayInstanceExpressionTypeReference)(es2panda_AstNode *ast);
322     es2panda_AstNode *(*NewArrayInstanceExpressionDimension)(es2panda_AstNode *ast);
323 
324     bool (*IsNewMultiDimArrayInstanceExpression)(es2panda_AstNode *ast);
325     es2panda_AstNode *(*CreateNewMultiDimArrayInstanceExpression)(es2panda_Context *context,
326                                                                   es2panda_AstNode *type_reference,
327                                                                   es2panda_AstNode **dimensions, size_t n_dimensions);
328     es2panda_AstNode *(*NewMultiDimArrayInstanceExpressionTypeReference)(es2panda_AstNode *ast);
329     es2panda_AstNode *const *(*NewMultiDimArrayInstanceExpressionDimensions)(es2panda_AstNode *ast, size_t *size_p);
330 
331     bool (*IsNonNullExpression)(es2panda_AstNode *ast);
332     bool (*IsNumberLiteral)(es2panda_AstNode *ast);
333     bool (*IsObjectExpression)(es2panda_AstNode *ast);
334 
335     bool (*IsParameterDeclaration)(es2panda_AstNode *ast);
336     es2panda_AstNode *(*CreateParameterDeclaration)(es2panda_Context *context, es2panda_AstNode *identifier_or_spread,
337                                                     es2panda_AstNode *initializer);
338     es2panda_AstNode *(*ParameterDeclarationIdentifierOrSpread)(es2panda_AstNode *ast);
339     es2panda_AstNode *(*ParameterDeclarationInitializer)(es2panda_AstNode *ast);
340 
341     bool (*IsPrimitiveTypeNode)(es2panda_AstNode *ast);
342     es2panda_AstNode *(*CreatePrimitiveTypeNode)(es2panda_Context *context, char const *type);
343     char const *(*PrimitiveTypeNodeType)(es2panda_AstNode *ast);
344 
345     bool (*IsReturnStatement)(es2panda_AstNode *ast);
346     es2panda_AstNode *(*CreatereturnStatement)(es2panda_Context *context, es2panda_AstNode *argument);
347     es2panda_AstNode *(*ReturnStatementArgument)(es2panda_AstNode *ast);
348     es2panda_Type *(*ReturnStatementReturnType)(es2panda_AstNode *ast);
349 
350     bool (*IsScriptFunction)(es2panda_AstNode *ast);
351     es2panda_AstNode *(*CreateScriptFunction)(es2panda_Context *context, es2panda_AstNode *type_params,
352                                               es2panda_AstNode **params, size_t n_params,
353                                               es2panda_AstNode *return_type_annotation,
354                                               es2panda_ScriptFunctionFlags function_flags,
355                                               es2panda_ModifierFlags modifier_flags, bool is_declare);
356     es2panda_AstNode *(*ScriptFunctionTypeParams)(es2panda_AstNode *ast);
357     es2panda_AstNode *const *(*ScriptFunctionParams)(es2panda_AstNode *ast, size_t *size_p);
358     es2panda_AstNode *(*ScriptFunctionReturnTypeAnnotation)(es2panda_AstNode *ast);
359     es2panda_ScriptFunctionFlags (*ScriptFunctionScriptFunctionFlags)(es2panda_AstNode *ast);
360     bool (*ScriptFunctionIsDeclare)(es2panda_AstNode *ast);
361     es2panda_AstNode *(*ScriptFunctionIdentifier)(es2panda_AstNode *ast);
362     es2panda_AstNode *(*ScriptFunctionBody)(es2panda_AstNode *ast);
363     void (*ScriptFunctionSetIdentifier)(es2panda_AstNode *ast, es2panda_AstNode *ident);
364     void (*ScriptFunctionSetBody)(es2panda_AstNode *ast, es2panda_AstNode *body);
365     void (*ScriptFunctionSetParams)(es2panda_AstNode *ast, es2panda_AstNode **params, size_t n_params);
366     void (*ScripFunctionAddParam)(es2panda_AstNode *ast, es2panda_AstNode *param);
367 
368     bool (*IsStringLiteral)(es2panda_AstNode *ast);
369     es2panda_AstNode *(*CreateStringLiteral)(es2panda_Context *context, char const *string);
370     char const *(*StringLiteralString)(es2panda_Context *context, es2panda_AstNode *ast);
371 
372     bool (*IsThisExpression)(es2panda_AstNode *ast);
373     es2panda_AstNode *(*CreateThisExpression)(es2panda_Context *context);
374 
375     bool (*IsTypeParameter)(es2panda_AstNode *ast);
376     es2panda_AstNode *(*CreateTypeParameter)(es2panda_Context *context, es2panda_AstNode *name,
377                                              es2panda_AstNode *constraint, es2panda_AstNode *defaultType);
378     es2panda_AstNode const *(*TypeParameterName)(es2panda_AstNode *ast);
379     es2panda_AstNode const *(*TypeParameterConstraint)(es2panda_AstNode *ast);
380     es2panda_AstNode const *(*TypeParameterDefaultType)(es2panda_AstNode *ast);
381 
382     bool (*IsTypeParameterDeclaration)(es2panda_AstNode *ast);
383     es2panda_AstNode *(*CreateTypeParameterDeclaration)(es2panda_Context *context);
384     void (*TypeParameterDeclarationAddTypeParameter)(es2panda_AstNode *ast, es2panda_AstNode *type_parameter);
385     es2panda_AstNode *const *(*TypeParameterDeclarationTypeParameters)(es2panda_AstNode *ast, size_t *size_p);
386 
387     bool (*IsTypeParameterInstantiation)(es2panda_AstNode *ast);
388     es2panda_AstNode *(*CreateTypeParameterInstantiation)(es2panda_Context *context, es2panda_AstNode **params,
389                                                           size_t n_params);
390     es2panda_AstNode *const *(*TypeParameterInstantiationTypeParameters)(es2panda_AstNode *ast, size_t *size_p);
391 
392     bool (*IsTypeReferenceNode)(es2panda_AstNode *ast);
393     es2panda_AstNode *(*CreateTypeReferenceNode)(es2panda_Context *context, es2panda_AstNode *part);
394     es2panda_AstNode *(*TypeRefrenceNodePart)(es2panda_AstNode *ast);
395 
396     bool (*IsTypeReferencePart)(es2panda_AstNode *ast);
397     es2panda_AstNode *(*CreateTypeReferencePart)(es2panda_Context *context, es2panda_AstNode *name,
398                                                  es2panda_AstNode *type_arguments, es2panda_AstNode *previous);
399     es2panda_AstNode *(*TypeReferencePartName)(es2panda_AstNode *ast);
400     es2panda_AstNode *(*TypeReferencePartTypeArguments)(es2panda_AstNode *ast);
401     es2panda_AstNode *(*TypeReferencePartPrevious)(es2panda_AstNode *ast);
402 
403     bool (*IsUnionTypeNode)(es2panda_AstNode *ast);
404     es2panda_AstNode *(*CreateUnionTypeNode)(es2panda_Context *context, es2panda_AstNode **types, size_t n_types);
405     es2panda_AstNode *const *(*UnionTypeNodeTypes)(es2panda_AstNode *ast, size_t *size_p);
406 
407     bool (*IsVariableDeclaration)(es2panda_AstNode *ast);
408     es2panda_AstNode *(*CreateVariableDeclaration)(es2panda_Context *context, char const *kind,
409                                                    es2panda_AstNode **declarators, size_t n_declarators,
410                                                    bool is_declare);
411     char const *(*VariableDeclarationKind)(es2panda_AstNode *ast);
412     es2panda_AstNode *const *(*VariableDeclarationDeclarators)(es2panda_AstNode *ast, size_t *size_p);
413     bool (*VariableDeclarationIsDeclare)(es2panda_AstNode *ast);
414 
415     bool (*IsVariableDeclarator)(es2panda_AstNode *ast);
416     es2panda_AstNode *(*CreateVariableDeclarator)(es2panda_Context *context, es2panda_AstNode *identifier,
417                                                   es2panda_AstNode *initializer);
418     es2panda_AstNode *(*VariableDeclaratorIdentifier)(es2panda_AstNode *ast);
419     es2panda_AstNode *(*VariableDeclaratorInitializer)(es2panda_AstNode *ast);
420 };
421 
422 struct es2panda_Impl const *es2panda_GetImpl(int version);
423 // NOLINTEND
424 
425 #ifdef __cplusplus
426 }
427 #endif
428 
429 #endif  // ES2PANDA_LIB
430