/*
 * Copyright (c) 2025-2026 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


typedef (String or f64 or boolean) es2panda_variantDoubleCharArrayBool;


[Entity=Class] interface es2panda_Config {};
[Entity=Class] interface es2panda_Context {};
[Entity=Class] interface es2panda_GlobalContext {};
[Entity=Class] interface es2panda_ExternalSource {};
[Entity=Class] interface es2panda_SourcePosition {};
[Entity=Class] interface es2panda_SourceRange {};
[Entity=Class] interface es2panda_LabelPair {};
[Entity=Class] interface es2panda_ScriptFunctionData {};
[Entity=Class] interface es2panda_ImportSource {};
[Entity=Class] interface es2panda_SignatureInfo {};
[Entity=Class] interface es2panda_IndexInfo {};
[Entity=Class] interface es2panda_ObjectDescriptor {};
[Entity=Class] interface es2panda_ScopeFindResult {};
[Entity=Class] interface es2panda_BindingProps {};
[Entity=Class] interface es2panda_Declaration {};
[Entity=Class] interface es2panda_AstVisitor {};
[Entity=Class] interface es2panda_AstVerifier {};
[Entity=Class] interface es2panda_VerifierMessage {};
[Entity=Class] interface es2panda_CodeGen {};
[Entity=Class] interface es2panda_VReg {};
[Entity=Class] interface es2panda_IRNode {};
[Entity=Class] interface es2panda_ErrorLogger {};
[Entity=Class] interface es2panda_VerificationContext {};
[Entity=Class] interface es2panda_DiagnosticKind {};
[Entity=Class] interface es2panda_DiagnosticStorage {};


interface NodeTraverser {
    void Do(ir.AstNode e2p_node);
};

interface NodeTransformer {
    ir.AstNode Do(ir.AstNode e2p_node);
};

interface NodePredicate {
    boolean Do(ir.AstNode e2p_node);
};

interface PropertyProcessor {
    varbinder.Variable Do(varbinder.Variable e2p_variable, checker.Type e2p_type);
};

interface PropertyTraverser {
    void Do(varbinder.Variable e2p_variable);
};

interface ClassBuilder {
    void Do(sequence<ir.AstNode> e2p_node, u32 size);
};

interface MethodBuilder {
    void Do(sequence<ir.Statement> statements, u32 sizeStatements, sequence<ir.Expression> expression,
        u32 sizeExpression, sequence<checker.Type> e2p_type);
};

interface ClassInitializerBuilder {
    void Do(sequence<ir.Statement> statements, u32 sizeStatements, sequence<ir.Expression> expression,
        u32 sizeExpression);
};

interface AstNodeForEachFunction {
    void Do(ir.AstNode node, VoidPtr arg);
};

interface es2panda_DynamicImportData {
    attribute ir.ETSImportDeclaration import_node;
    attribute ir.AstNode specifier;
    attribute varbinder.Variable variable;
};

interface es2panda_OverloadInfo {
    attribute u32 minArg;
    attribute u32 maxArg;
    attribute boolean needHelperOverload;
    attribute boolean isDeclare;
    attribute boolean hasRestVar;
    attribute boolean returnVoid;
};

dictionary es2panda_ContextState {
    i32 ES2PANDA_STATE_NEW = 0;
    i32 ES2PANDA_STATE_PARSED = 1;
    i32 ES2PANDA_STATE_BOUND = 2;
    i32 ES2PANDA_STATE_CHECKED = 3;
    i32 ES2PANDA_STATE_LOWERED = 4;
    i32 ES2PANDA_STATE_ASM_GENERATED = 5;
    i32 ES2PANDA_STATE_BIN_GENERATED = 6;
    i32 ES2PANDA_STATE_ERROR = 7;
};

interface es2panda_SuggestionInfo {
    attribute es2panda_DiagnosticKind kind;
    attribute sequence<String> args;
    attribute u32 argc;
    attribute String substitutionCode;
    attribute String title;
    attribute es2panda_SourceRange range;
};

interface es2panda_DiagnosticInfo {
    attribute es2panda_DiagnosticKind kind;
    attribute sequence<String> args;
    attribute u32 argc;
    attribute es2panda_SourcePosition pos;
};

dictionary es2panda_PluginDiagnosticType {
    i32 ES2PANDA_PLUGIN_WARNING = 0;
    i32 ES2PANDA_PLUGIN_ERROR = 1;
    i32 ES2PANDA_PLUGIN_SUGGESTION = 2;
};

dictionary Es2pandaLanguage {
    i32 LANGUAGE_AS = 0;
    i32 LANGUAGE_JS = 1;
    i32 LANGUAGE_TS = 2;
    i32 LANGUAGE_ETS = 3;
};

[Entity=Class] interface VoidPtr {}; // void *


dictionary Es2pandaAstNodeType {
    i32 AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION = 0;
    i32 AST_NODE_TYPE_ANNOTATION_DECLARATION = 1;
    i32 AST_NODE_TYPE_ANNOTATION_USAGE = 2;
    i32 AST_NODE_TYPE_ASSERT_STATEMENT = 3;
    i32 AST_NODE_TYPE_AWAIT_EXPRESSION = 4;
    i32 AST_NODE_TYPE_BIGINT_LITERAL = 5;
    i32 AST_NODE_TYPE_BINARY_EXPRESSION = 6;
    i32 AST_NODE_TYPE_BLOCK_STATEMENT = 7;
    i32 AST_NODE_TYPE_BOOLEAN_LITERAL = 8;
    i32 AST_NODE_TYPE_BREAK_STATEMENT = 9;
    i32 AST_NODE_TYPE_CALL_EXPRESSION = 10;
    i32 AST_NODE_TYPE_CATCH_CLAUSE = 11;
    i32 AST_NODE_TYPE_CHAIN_EXPRESSION = 12;
    i32 AST_NODE_TYPE_CHAR_LITERAL = 13;
    i32 AST_NODE_TYPE_CLASS_DEFINITION = 14;
    i32 AST_NODE_TYPE_CLASS_DECLARATION = 15;
    i32 AST_NODE_TYPE_CLASS_EXPRESSION = 16;
    i32 AST_NODE_TYPE_CLASS_PROPERTY = 17;
    i32 AST_NODE_TYPE_CLASS_STATIC_BLOCK = 18;
    i32 AST_NODE_TYPE_CONDITIONAL_EXPRESSION = 19;
    i32 AST_NODE_TYPE_CONTINUE_STATEMENT = 20;
    i32 AST_NODE_TYPE_DEBUGGER_STATEMENT = 21;
    i32 AST_NODE_TYPE_DECORATOR = 22;
    i32 AST_NODE_TYPE_DIRECT_EVAL = 23;
    i32 AST_NODE_TYPE_DO_WHILE_STATEMENT = 24;
    i32 AST_NODE_TYPE_EMPTY_STATEMENT = 25;
    i32 AST_NODE_TYPE_EXPORT_ALL_DECLARATION = 26;
    i32 AST_NODE_TYPE_EXPORT_DEFAULT_DECLARATION = 27;
    i32 AST_NODE_TYPE_EXPORT_NAMED_DECLARATION = 28;
    i32 AST_NODE_TYPE_EXPORT_SPECIFIER = 29;
    i32 AST_NODE_TYPE_EXPRESSION_STATEMENT = 30;
    i32 AST_NODE_TYPE_FOR_IN_STATEMENT = 31;
    i32 AST_NODE_TYPE_FOR_OF_STATEMENT = 32;
    i32 AST_NODE_TYPE_FOR_UPDATE_STATEMENT = 33;
    i32 AST_NODE_TYPE_FUNCTION_DECLARATION = 34;
    i32 AST_NODE_TYPE_FUNCTION_EXPRESSION = 35;
    i32 AST_NODE_TYPE_IDENTIFIER = 36;
    i32 AST_NODE_TYPE_DUMMYNODE = 37;
    i32 AST_NODE_TYPE_IF_STATEMENT = 38;
    i32 AST_NODE_TYPE_IMPORT_DECLARATION = 39;
    i32 AST_NODE_TYPE_IMPORT_EXPRESSION = 40;
    i32 AST_NODE_TYPE_IMPORT_DEFAULT_SPECIFIER = 41;
    i32 AST_NODE_TYPE_IMPORT_NAMESPACE_SPECIFIER = 42;
    i32 AST_NODE_TYPE_IMPORT_SPECIFIER = 43;
    i32 AST_NODE_TYPE_LABELLED_STATEMENT = 44;
    i32 AST_NODE_TYPE_MEMBER_EXPRESSION = 45;
    i32 AST_NODE_TYPE_META_PROPERTY_EXPRESSION = 46;
    i32 AST_NODE_TYPE_METHOD_DEFINITION = 47;
    i32 AST_NODE_TYPE_NAMED_TYPE = 48;
    i32 AST_NODE_TYPE_NEW_EXPRESSION = 49;
    i32 AST_NODE_TYPE_NULL_LITERAL = 50;
    i32 AST_NODE_TYPE_UNDEFINED_LITERAL = 51;
    i32 AST_NODE_TYPE_NUMBER_LITERAL = 52;
    i32 AST_NODE_TYPE_OMITTED_EXPRESSION = 53;
    i32 AST_NODE_TYPE_OVERLOAD_DECLARATION = 54;
    i32 AST_NODE_TYPE_PREFIX_ASSERTION_EXPRESSION = 55;
    i32 AST_NODE_TYPE_PROPERTY = 56;
    i32 AST_NODE_TYPE_REGEXP_LITERAL = 57;
    i32 AST_NODE_TYPE_REEXPORT_STATEMENT = 58;
    i32 AST_NODE_TYPE_RETURN_STATEMENT = 59;
    i32 AST_NODE_TYPE_SCRIPT_FUNCTION = 60;
    i32 AST_NODE_TYPE_SEQUENCE_EXPRESSION = 61;
    i32 AST_NODE_TYPE_STRING_LITERAL = 62;
    i32 AST_NODE_TYPE_ETS_NON_NULLISH_TYPE = 63;
    i32 AST_NODE_TYPE_ETS_NULL_TYPE = 64;
    i32 AST_NODE_TYPE_ETS_UNDEFINED_TYPE = 65;
    i32 AST_NODE_TYPE_ETS_NEVER_TYPE = 66;
    i32 AST_NODE_TYPE_ETS_STRING_LITERAL_TYPE = 67;
    i32 AST_NODE_TYPE_ETS_INTRINSIC_NODE_TYPE = 68;
    i32 AST_NODE_TYPE_ETS_FUNCTION_TYPE = 69;
    i32 AST_NODE_TYPE_ETS_WILDCARD_TYPE = 70;
    i32 AST_NODE_TYPE_ETS_GENERIC_INSTANTIATED_NODE = 71;
    i32 AST_NODE_TYPE_ETS_PRIMITIVE_TYPE = 72;
    i32 AST_NODE_TYPE_ETS_PACKAGE_DECLARATION = 73;
    i32 AST_NODE_TYPE_ETS_CLASS_LITERAL = 74;
    i32 AST_NODE_TYPE_ETS_TYPE_REFERENCE = 75;
    i32 AST_NODE_TYPE_ETS_TYPE_REFERENCE_PART = 76;
    i32 AST_NODE_TYPE_ETS_DESTRUCTURING = 77;
    i32 AST_NODE_TYPE_ETS_UNION_TYPE = 78;
    i32 AST_NODE_TYPE_ETS_KEYOF_TYPE = 79;
    i32 AST_NODE_TYPE_ETS_NEW_ARRAY_INSTANCE_EXPRESSION = 80;
    i32 AST_NODE_TYPE_ETS_NEW_MULTI_DIM_ARRAY_INSTANCE_EXPRESSION = 81;
    i32 AST_NODE_TYPE_ETS_NEW_CLASS_INSTANCE_EXPRESSION = 82;
    i32 AST_NODE_TYPE_ETS_IMPORT_DECLARATION = 83;
    i32 AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION = 84;
    i32 AST_NODE_TYPE_ETS_TUPLE = 85;
    i32 AST_NODE_TYPE_ETS_MODULE = 86;
    i32 AST_NODE_TYPE_SUPER_EXPRESSION = 87;
    i32 AST_NODE_TYPE_STRUCT_DECLARATION = 88;
    i32 AST_NODE_TYPE_SWITCH_CASE_STATEMENT = 89;
    i32 AST_NODE_TYPE_SWITCH_STATEMENT = 90;
    i32 AST_NODE_TYPE_TS_ENUM_DECLARATION = 91;
    i32 AST_NODE_TYPE_TS_ENUM_MEMBER = 92;
    i32 AST_NODE_TYPE_TS_EXTERNAL_MODULE_REFERENCE = 93;
    i32 AST_NODE_TYPE_TS_NUMBER_KEYWORD = 94;
    i32 AST_NODE_TYPE_TS_ANY_KEYWORD = 95;
    i32 AST_NODE_TYPE_TS_STRING_KEYWORD = 96;
    i32 AST_NODE_TYPE_TS_BOOLEAN_KEYWORD = 97;
    i32 AST_NODE_TYPE_TS_VOID_KEYWORD = 98;
    i32 AST_NODE_TYPE_TS_UNDEFINED_KEYWORD = 99;
    i32 AST_NODE_TYPE_TS_UNKNOWN_KEYWORD = 100;
    i32 AST_NODE_TYPE_TS_OBJECT_KEYWORD = 101;
    i32 AST_NODE_TYPE_TS_BIGINT_KEYWORD = 102;
    i32 AST_NODE_TYPE_TS_NEVER_KEYWORD = 103;
    i32 AST_NODE_TYPE_TS_NON_NULL_EXPRESSION = 104;
    i32 AST_NODE_TYPE_TS_NULL_KEYWORD = 105;
    i32 AST_NODE_TYPE_TS_ARRAY_TYPE = 106;
    i32 AST_NODE_TYPE_TS_UNION_TYPE = 107;
    i32 AST_NODE_TYPE_TS_TYPE_LITERAL = 108;
    i32 AST_NODE_TYPE_TS_PROPERTY_SIGNATURE = 109;
    i32 AST_NODE_TYPE_TS_METHOD_SIGNATURE = 110;
    i32 AST_NODE_TYPE_TS_SIGNATURE_DECLARATION = 111;
    i32 AST_NODE_TYPE_TS_PARENT_TYPE = 112;
    i32 AST_NODE_TYPE_TS_LITERAL_TYPE = 113;
    i32 AST_NODE_TYPE_TS_INFER_TYPE = 114;
    i32 AST_NODE_TYPE_TS_CONDITIONAL_TYPE = 115;
    i32 AST_NODE_TYPE_TS_IMPORT_TYPE = 116;
    i32 AST_NODE_TYPE_TS_INTERSECTION_TYPE = 117;
    i32 AST_NODE_TYPE_TS_MAPPED_TYPE = 118;
    i32 AST_NODE_TYPE_TS_MODULE_BLOCK = 119;
    i32 AST_NODE_TYPE_TS_THIS_TYPE = 120;
    i32 AST_NODE_TYPE_TS_TYPE_OPERATOR = 121;
    i32 AST_NODE_TYPE_TS_TYPE_PARAMETER = 122;
    i32 AST_NODE_TYPE_TS_TYPE_PARAMETER_DECLARATION = 123;
    i32 AST_NODE_TYPE_TS_TYPE_PARAMETER_INSTANTIATION = 124;
    i32 AST_NODE_TYPE_TS_TYPE_PREDICATE = 125;
    i32 AST_NODE_TYPE_TS_PARAMETER_PROPERTY = 126;
    i32 AST_NODE_TYPE_TS_MODULE_DECLARATION = 127;
    i32 AST_NODE_TYPE_TS_IMPORT_EQUALS_DECLARATION = 128;
    i32 AST_NODE_TYPE_TS_FUNCTION_TYPE = 129;
    i32 AST_NODE_TYPE_TS_CONSTRUCTOR_TYPE = 130;
    i32 AST_NODE_TYPE_TS_TYPE_ALIAS_DECLARATION = 131;
    i32 AST_NODE_TYPE_TS_TYPE_REFERENCE = 132;
    i32 AST_NODE_TYPE_TS_QUALIFIED_NAME = 133;
    i32 AST_NODE_TYPE_TS_INDEXED_ACCESS_TYPE = 134;
    i32 AST_NODE_TYPE_TS_INTERFACE_DECLARATION = 135;
    i32 AST_NODE_TYPE_TS_INTERFACE_BODY = 136;
    i32 AST_NODE_TYPE_TS_INTERFACE_HERITAGE = 137;
    i32 AST_NODE_TYPE_TS_TUPLE_TYPE = 138;
    i32 AST_NODE_TYPE_TS_NAMED_TUPLE_MEMBER = 139;
    i32 AST_NODE_TYPE_TS_INDEX_SIGNATURE = 140;
    i32 AST_NODE_TYPE_TS_TYPE_QUERY = 141;
    i32 AST_NODE_TYPE_TS_AS_EXPRESSION = 142;
    i32 AST_NODE_TYPE_TS_CLASS_IMPLEMENTS = 143;
    i32 AST_NODE_TYPE_TS_TYPE_ASSERTION = 144;
    i32 AST_NODE_TYPE_TAGGED_TEMPLATE_EXPRESSION = 145;
    i32 AST_NODE_TYPE_TEMPLATE_ELEMENT = 146;
    i32 AST_NODE_TYPE_TEMPLATE_LITERAL = 147;
    i32 AST_NODE_TYPE_THIS_EXPRESSION = 148;
    i32 AST_NODE_TYPE_TYPEOF_EXPRESSION = 149;
    i32 AST_NODE_TYPE_THROW_STATEMENT = 150;
    i32 AST_NODE_TYPE_TRY_STATEMENT = 151;
    i32 AST_NODE_TYPE_UNARY_EXPRESSION = 152;
    i32 AST_NODE_TYPE_UPDATE_EXPRESSION = 153;
    i32 AST_NODE_TYPE_VARIABLE_DECLARATION = 154;
    i32 AST_NODE_TYPE_VARIABLE_DECLARATOR = 155;
    i32 AST_NODE_TYPE_WHILE_STATEMENT = 156;
    i32 AST_NODE_TYPE_YIELD_EXPRESSION = 157;
    i32 AST_NODE_TYPE_OPAQUE_TYPE_NODE = 158;
    i32 AST_NODE_TYPE_BLOCK_EXPRESSION = 159;
    i32 AST_NODE_TYPE_BROKEN_TYPE_NODE = 160;
    i32 AST_NODE_TYPE_ARRAY_EXPRESSION = 161;
    i32 AST_NODE_TYPE_ARRAY_PATTERN = 162;
    i32 AST_NODE_TYPE_ASSIGNMENT_EXPRESSION = 163;
    i32 AST_NODE_TYPE_ASSIGNMENT_PATTERN = 164;
    i32 AST_NODE_TYPE_OBJECT_EXPRESSION = 165;
    i32 AST_NODE_TYPE_OBJECT_PATTERN = 166;
    i32 AST_NODE_TYPE_SPREAD_ELEMENT = 167;
    i32 AST_NODE_TYPE_REST_ELEMENT = 168;
};

dictionary Es2pandaScopeType {
    i32 SCOPE_TYPE_PARAM = 0;
    i32 SCOPE_TYPE_CATCH_PARAM = 1;
    i32 SCOPE_TYPE_FUNCTION_PARAM = 2;
    i32 SCOPE_TYPE_CATCH = 3;
    i32 SCOPE_TYPE_CLASS = 4;
    i32 SCOPE_TYPE_ANNOTATION = 5;
    i32 SCOPE_TYPE_ANNOTATIONPARAMSCOPE = 6;
    i32 SCOPE_TYPE_LOCAL = 7;
    i32 SCOPE_TYPE_LOOP = 8;
    i32 SCOPE_TYPE_LOOP_DECL = 9;
    i32 SCOPE_TYPE_FUNCTION = 10;
    i32 SCOPE_TYPE_GLOBAL = 11;
    i32 SCOPE_TYPE_MODULE = 12;
};

dictionary Es2pandaDeclType {
    i32 DECL_TYPE_NONE = 0;
    i32 DECL_TYPE_VAR = 1;
    i32 DECL_TYPE_LET = 2;
    i32 DECL_TYPE_CONST = 3;
    i32 DECL_TYPE_LABEL = 4;
    i32 DECL_TYPE_READONLY = 5;
    i32 DECL_TYPE_FUNC = 6;
    i32 DECL_TYPE_PARAM = 7;
    i32 DECL_TYPE_IMPORT = 8;
    i32 DECL_TYPE_DYNAMIC_IMPORT = 9;
    i32 DECL_TYPE_EXPORT = 10;
    i32 DECL_TYPE_ANNOTATIONDECL = 11;
    i32 DECL_TYPE_ANNOTATIONUSAGE = 12;
    i32 DECL_TYPE_TYPE_ALIAS = 13;
    i32 DECL_TYPE_NAMESPACE = 14;
    i32 DECL_TYPE_INTERFACE = 15;
    i32 DECL_TYPE_ENUM_LITERAL = 16;
    i32 DECL_TYPE_TYPE_PARAMETER = 17;
    i32 DECL_TYPE_PROPERTY = 18;
    i32 DECL_TYPE_CLASS = 19;
    i32 DECL_TYPE_METHOD = 20;
    i32 DECL_TYPE_ENUM = 21;
};

dictionary Es2pandaResolveBindingOptions {
    i32 RESOLVE_BINDING_OPTIONS_BINDINGS = 0;
    i32 RESOLVE_BINDING_OPTIONS_INTERFACES = 1;
    i32 RESOLVE_BINDING_OPTIONS_VARIABLES = 2;
    i32 RESOLVE_BINDING_OPTIONS_METHODS = 4;
    i32 RESOLVE_BINDING_OPTIONS_DECLARATION = 8;
    i32 RESOLVE_BINDING_OPTIONS_STATIC_VARIABLES = 16;
    i32 RESOLVE_BINDING_OPTIONS_STATIC_METHODS = 32;
    i32 RESOLVE_BINDING_OPTIONS_STATIC_DECLARATION = 64;
    i32 RESOLVE_BINDING_OPTIONS_TYPE_ALIASES = 128;
    i32 RESOLVE_BINDING_OPTIONS_ALL = 256;
    i32 RESOLVE_BINDING_OPTIONS_ALL_VARIABLES = 18;
    i32 RESOLVE_BINDING_OPTIONS_ALL_METHOD = 36;
    i32 RESOLVE_BINDING_OPTIONS_ALL_DECLARATION = 72;
    i32 RESOLVE_BINDING_OPTIONS_ALL_STATIC = 112;
    i32 RESOLVE_BINDING_OPTIONS_ALL_NON_STATIC = 14;
    i32 RESOLVE_BINDING_OPTIONS_LAST = 128;
};

dictionary Es2pandaVariableKind {
    i32 VARIABLE_KIND_NONE = 0;
    i32 VARIABLE_KIND_VAR = 1;
    i32 VARIABLE_KIND_LEXICAL = 2;
    i32 VARIABLE_KIND_FUNCTION = 3;
    i32 VARIABLE_KIND_MODULE = 4;
};


typedef u64 Es2pandaVariableFlags;

dictionary Es2pandaLetOrConstStatus {
    i32 LET_OR_CONST_STATUS_INITIALIZED = 0;
    i32 LET_OR_CONST_STATUS_UNINITIALIZED = 1;
};

dictionary Es2pandaScopeFlags {
    i32 SCOPE_FLAGS_NONE = 0;
    i32 SCOPE_FLAGS_SET_LEXICAL_FUNCTION = 1;
    i32 SCOPE_FLAGS_USE_ARGS = 2;
    i32 SCOPE_FLAGS_USE_SUPER = 4;
    i32 SCOPE_FLAGS_INNER_ARROW = 8;
    i32 SCOPE_FLAGS_NO_REG_STORE = 16;
    i32 SCOPE_FLAGS_DECL_SCOPE = 32;
    i32 SCOPE_FLAGS_FIELD_SCOPE = 64;
    i32 SCOPE_FLAGS_METHOD_SCOPE = 128;
    i32 SCOPE_FLAGS_STATIC = 256;
    i32 SCOPE_FLAGS_TYPE_ALIAS = 512;
    i32 SCOPE_FLAGS_LOOP_SCOPE = 1024;
    i32 SCOPE_FLAGS_STATIC_DECL_SCOPE = 288;
    i32 SCOPE_FLAGS_STATIC_FIELD_SCOPE = 320;
    i32 SCOPE_FLAGS_STATIC_METHOD_SCOPE = 384;
};

dictionary Es2pandaEnum {
    i32 ENUM_NODE_HAS_PARENT = 0;
    i32 ENUM_NODE_HAS_SOURCE_RANGE = 1;
    i32 ENUM_EVERY_CHILD_HAS_VALID_PARENT = 2;
    i32 ENUM_EVERY_CHILD_IN_PARENT_RANGE = 3;
    i32 ENUM_CHECK_STRUCT_DECLARATION = 4;
    i32 ENUM_VARIABLE_HAS_SCOPE = 5;
    i32 ENUM_NODE_HAS_TYPE = 6;
    i32 ENUM_NO_PRIMITIVE_TYPES = 7;
    i32 ENUM_ENUM_HAS_CORRECT_TYPE = 8;
    i32 ENUM_IDENTIFIER_HAS_VARIABLE = 9;
    i32 ENUM_REFERENCE_TYPE_ANNOTATION_IS_NULL = 10;
    i32 ENUM_ARITHMETIC_OPERATION_VALID = 11;
    i32 ENUM_SEQUENCE_EXPRESSION_HAS_LAST_TYPE = 12;
    i32 ENUM_FOR_LOOP_CORRECTLY_INITIALIZED = 13;
    i32 ENUM_VARIABLE_HAS_ENCLOSING_SCOPE = 14;
    i32 ENUM_MODIFIER_ACCESS_VALID = 15;
    i32 ENUM_VARIABLE_NAME_IDENTIFIER_NAME_SAME = 16;
    i32 ENUM_CHECK_ABSTRACT_METHOD = 17;
    i32 ENUM_GETTER_SETTER_VALIDATION = 18;
    i32 ENUM_CHECK_SCOPE_DECLARATION = 19;
    i32 ENUM_CHECK_CONST_PROPERTIES = 20;
    i32 ENUM_COUNT = 21;
    i32 ENUM_BASE_FIRST = 0;
    i32 ENUM_BASE_LAST = 3;
    i32 ENUM_AFTER_PLUGINS_AFTER_PARSE_FIRST = 4;
    i32 ENUM_AFTER_PLUGINS_AFTER_PARSE_LAST = 4;
    i32 ENUM_AFTER_SCOPES_INIT_PHASE_FIRST = 5;
    i32 ENUM_AFTER_SCOPES_INIT_PHASE_LAST = 5;
    i32 ENUM_AFTER_CHECKER_PHASE_FIRST = 6;
    i32 ENUM_AFTER_CHECKER_PHASE_LAST = 20;
    i32 ENUM_FIRST = 0;
    i32 ENUM_LAST = 20;
    i32 ENUM_INVALID = 21;
};

dictionary Es2pandaRegExpFlags {
    i32 REG_EXP_FLAGS_EMPTY = 0;
    i32 REG_EXP_FLAGS_GLOBAL = 1;
    i32 REG_EXP_FLAGS_IGNORE_CASE = 2;
    i32 REG_EXP_FLAGS_MULTILINE = 4;
    i32 REG_EXP_FLAGS_DOTALL = 8;
    i32 REG_EXP_FLAGS_UNICODE = 16;
    i32 REG_EXP_FLAGS_STICKY = 32;
};

dictionary Es2pandaId {
    i32 ID_AS = 0;
    i32 ID_JS = 1;
    i32 ID_TS = 2;
    i32 ID_ETS = 3;
    i32 ID_COUNT = 4;
};

dictionary Es2pandaTokenType {
    i32 TOKEN_TYPE_EOS = 0;
    i32 TOKEN_TYPE_LITERAL_IDENT = 1;
    i32 TOKEN_TYPE_LITERAL_STRING = 2;
    i32 TOKEN_TYPE_LITERAL_CHAR = 3;
    i32 TOKEN_TYPE_LITERAL_NUMBER = 4;
    i32 TOKEN_TYPE_LITERAL_REGEXP = 5;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_AND = 6;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_OR = 7;
    i32 TOKEN_TYPE_PUNCTUATOR_MULTIPLY = 8;
    i32 TOKEN_TYPE_PUNCTUATOR_DIVIDE = 9;
    i32 TOKEN_TYPE_PUNCTUATOR_MINUS = 10;
    i32 TOKEN_TYPE_PUNCTUATOR_EXCLAMATION_MARK = 11;
    i32 TOKEN_TYPE_PUNCTUATOR_TILDE = 12;
    i32 TOKEN_TYPE_PUNCTUATOR_MINUS_MINUS = 13;
    i32 TOKEN_TYPE_PUNCTUATOR_LEFT_SHIFT = 14;
    i32 TOKEN_TYPE_PUNCTUATOR_RIGHT_SHIFT = 15;
    i32 TOKEN_TYPE_PUNCTUATOR_LESS_THAN_EQUAL = 16;
    i32 TOKEN_TYPE_PUNCTUATOR_GREATER_THAN_EQUAL = 17;
    i32 TOKEN_TYPE_PUNCTUATOR_MOD = 18;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_XOR = 19;
    i32 TOKEN_TYPE_PUNCTUATOR_EXPONENTIATION = 20;
    i32 TOKEN_TYPE_PUNCTUATOR_MULTIPLY_EQUAL = 21;
    i32 TOKEN_TYPE_PUNCTUATOR_EXPONENTIATION_EQUAL = 22;
    i32 TOKEN_TYPE_PUNCTUATOR_ARROW = 23;
    i32 TOKEN_TYPE_PUNCTUATOR_BACK_TICK = 24;
    i32 TOKEN_TYPE_PUNCTUATOR_HASH_MARK = 25;
    i32 TOKEN_TYPE_PUNCTUATOR_DIVIDE_EQUAL = 26;
    i32 TOKEN_TYPE_PUNCTUATOR_MOD_EQUAL = 27;
    i32 TOKEN_TYPE_PUNCTUATOR_MINUS_EQUAL = 28;
    i32 TOKEN_TYPE_PUNCTUATOR_LEFT_SHIFT_EQUAL = 29;
    i32 TOKEN_TYPE_PUNCTUATOR_RIGHT_SHIFT_EQUAL = 30;
    i32 TOKEN_TYPE_PUNCTUATOR_UNSIGNED_RIGHT_SHIFT = 31;
    i32 TOKEN_TYPE_PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL = 32;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_AND_EQUAL = 33;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_OR_EQUAL = 34;
    i32 TOKEN_TYPE_PUNCTUATOR_LOGICAL_AND_EQUAL = 35;
    i32 TOKEN_TYPE_PUNCTUATOR_NULLISH_COALESCING = 36;
    i32 TOKEN_TYPE_PUNCTUATOR_LOGICAL_OR_EQUAL = 37;
    i32 TOKEN_TYPE_PUNCTUATOR_LOGICAL_NULLISH_EQUAL = 38;
    i32 TOKEN_TYPE_PUNCTUATOR_BITWISE_XOR_EQUAL = 39;
    i32 TOKEN_TYPE_PUNCTUATOR_PLUS = 40;
    i32 TOKEN_TYPE_PUNCTUATOR_PLUS_PLUS = 41;
    i32 TOKEN_TYPE_PUNCTUATOR_PLUS_EQUAL = 42;
    i32 TOKEN_TYPE_PUNCTUATOR_LESS_THAN = 43;
    i32 TOKEN_TYPE_PUNCTUATOR_GREATER_THAN = 44;
    i32 TOKEN_TYPE_PUNCTUATOR_EQUAL = 45;
    i32 TOKEN_TYPE_PUNCTUATOR_NOT_EQUAL = 46;
    i32 TOKEN_TYPE_PUNCTUATOR_STRICT_EQUAL = 47;
    i32 TOKEN_TYPE_PUNCTUATOR_NOT_STRICT_EQUAL = 48;
    i32 TOKEN_TYPE_PUNCTUATOR_LOGICAL_AND = 49;
    i32 TOKEN_TYPE_PUNCTUATOR_LOGICAL_OR = 50;
    i32 TOKEN_TYPE_PUNCTUATOR_SUBSTITUTION = 51;
    i32 TOKEN_TYPE_PUNCTUATOR_QUESTION_MARK = 52;
    i32 TOKEN_TYPE_PUNCTUATOR_QUESTION_DOT = 53;
    i32 TOKEN_TYPE_PUNCTUATOR_AT = 54;
    i32 TOKEN_TYPE_PUNCTUATOR_FORMAT = 55;
    i32 TOKEN_TYPE_PUNCTUATOR_RIGHT_PARENTHESIS = 56;
    i32 TOKEN_TYPE_PUNCTUATOR_LEFT_PARENTHESIS = 57;
    i32 TOKEN_TYPE_PUNCTUATOR_RIGHT_SQUARE_BRACKET = 58;
    i32 TOKEN_TYPE_PUNCTUATOR_LEFT_SQUARE_BRACKET = 59;
    i32 TOKEN_TYPE_PUNCTUATOR_RIGHT_BRACE = 60;
    i32 TOKEN_TYPE_PUNCTUATOR_PERIOD = 61;
    i32 TOKEN_TYPE_PUNCTUATOR_PERIOD_PERIOD_PERIOD = 62;
    i32 TOKEN_TYPE_PUNCTUATOR_PERIOD_QUESTION = 63;
    i32 TOKEN_TYPE_PUNCTUATOR_LEFT_BRACE = 64;
    i32 TOKEN_TYPE_PUNCTUATOR_SEMI_COLON = 65;
    i32 TOKEN_TYPE_PUNCTUATOR_COLON = 66;
    i32 TOKEN_TYPE_PUNCTUATOR_COMMA = 67;
    i32 TOKEN_TYPE_KEYW_ABSTRACT = 68;
    i32 TOKEN_TYPE_KEYW_ANY = 69;
    i32 TOKEN_TYPE_KEYW_BUILTIN_ANY = 70;
    i32 TOKEN_TYPE_KEYW_ANYREF = 71;
    i32 TOKEN_TYPE_KEYW_ARGUMENTS = 72;
    i32 TOKEN_TYPE_KEYW_AS = 73;
    i32 TOKEN_TYPE_KEYW_ASSERTS = 74;
    i32 TOKEN_TYPE_KEYW_ASYNC = 75;
    i32 TOKEN_TYPE_KEYW_AWAIT = 76;
    i32 TOKEN_TYPE_KEYW_BIGINT = 77;
    i32 TOKEN_TYPE_KEYW_BUILTIN_BIGINT = 78;
    i32 TOKEN_TYPE_KEYW_BOOLEAN = 79;
    i32 TOKEN_TYPE_KEYW_BUILTIN_BOOLEAN = 80;
    i32 TOKEN_TYPE_KEYW_BREAK = 81;
    i32 TOKEN_TYPE_KEYW_BYTE = 82;
    i32 TOKEN_TYPE_KEYW_BUILTIN_BYTE = 83;
    i32 TOKEN_TYPE_KEYW_CASE = 84;
    i32 TOKEN_TYPE_KEYW_CATCH = 85;
    i32 TOKEN_TYPE_KEYW_CHAR = 86;
    i32 TOKEN_TYPE_KEYW_BUILTIN_CHAR = 87;
    i32 TOKEN_TYPE_KEYW_CLASS = 88;
    i32 TOKEN_TYPE_KEYW_CONST = 89;
    i32 TOKEN_TYPE_KEYW_CONSTRUCTOR = 90;
    i32 TOKEN_TYPE_KEYW_CONTINUE = 91;
    i32 TOKEN_TYPE_KEYW_DATAREF = 92;
    i32 TOKEN_TYPE_KEYW_DEBUGGER = 93;
    i32 TOKEN_TYPE_KEYW_DECLARE = 94;
    i32 TOKEN_TYPE_KEYW_DEFAULT = 95;
    i32 TOKEN_TYPE_KEYW_DELETE = 96;
    i32 TOKEN_TYPE_KEYW_DO = 97;
    i32 TOKEN_TYPE_KEYW_DOUBLE = 98;
    i32 TOKEN_TYPE_KEYW_BUILTIN_DOUBLE = 99;
    i32 TOKEN_TYPE_KEYW_ELSE = 100;
    i32 TOKEN_TYPE_KEYW_ENUM = 101;
    i32 TOKEN_TYPE_KEYW_EQREF = 102;
    i32 TOKEN_TYPE_KEYW_EVAL = 103;
    i32 TOKEN_TYPE_KEYW_EXPORT = 104;
    i32 TOKEN_TYPE_KEYW_EXTENDS = 105;
    i32 TOKEN_TYPE_KEYW_EXTERNREF = 106;
    i32 TOKEN_TYPE_KEYW_F32 = 107;
    i32 TOKEN_TYPE_KEYW_F64 = 108;
    i32 TOKEN_TYPE_LITERAL_FALSE = 109;
    i32 TOKEN_TYPE_KEYW_FINALLY = 110;
    i32 TOKEN_TYPE_KEYW_FLOAT = 111;
    i32 TOKEN_TYPE_KEYW_BUILTIN_FLOAT = 112;
    i32 TOKEN_TYPE_KEYW_FOR = 113;
    i32 TOKEN_TYPE_KEYW_FROM = 114;
    i32 TOKEN_TYPE_KEYW_FUNCREF = 115;
    i32 TOKEN_TYPE_KEYW_FUNCTION = 116;
    i32 TOKEN_TYPE_KEYW_GET = 117;
    i32 TOKEN_TYPE_KEYW_GLOBAL = 118;
    i32 TOKEN_TYPE_KEYW_I8 = 119;
    i32 TOKEN_TYPE_KEYW_I16 = 120;
    i32 TOKEN_TYPE_KEYW_I31REF = 121;
    i32 TOKEN_TYPE_KEYW_I32 = 122;
    i32 TOKEN_TYPE_KEYW_I64 = 123;
    i32 TOKEN_TYPE_KEYW_IF = 124;
    i32 TOKEN_TYPE_KEYW_IMPLEMENTS = 125;
    i32 TOKEN_TYPE_KEYW_IMPORT = 126;
    i32 TOKEN_TYPE_KEYW_IN = 127;
    i32 TOKEN_TYPE_KEYW_INFER = 128;
    i32 TOKEN_TYPE_KEYW_INIT_MODULE = 129;
    i32 TOKEN_TYPE_KEYW_INSTANCEOF = 130;
    i32 TOKEN_TYPE_KEYW_INT = 131;
    i32 TOKEN_TYPE_KEYW_BUILTIN_INT = 132;
    i32 TOKEN_TYPE_KEYW_INTERFACE = 133;
    i32 TOKEN_TYPE_KEYW_IS = 134;
    i32 TOKEN_TYPE_KEYW_ISIZE = 135;
    i32 TOKEN_TYPE_KEYW_KEYOF = 136;
    i32 TOKEN_TYPE_KEYW_LET = 137;
    i32 TOKEN_TYPE_KEYW_LONG = 138;
    i32 TOKEN_TYPE_KEYW_BUILTIN_LONG = 139;
    i32 TOKEN_TYPE_KEYW_META = 140;
    i32 TOKEN_TYPE_KEYW_MODULE = 141;
    i32 TOKEN_TYPE_KEYW_NAMESPACE = 142;
    i32 TOKEN_TYPE_KEYW_NATIVE = 143;
    i32 TOKEN_TYPE_KEYW_NEVER = 144;
    i32 TOKEN_TYPE_KEYW_NEW = 145;
    i32 TOKEN_TYPE_KEYW_NON_NULLABLE = 146;
    i32 TOKEN_TYPE_LITERAL_NULL = 147;
    i32 TOKEN_TYPE_KEYW_NUMBER = 148;
    i32 TOKEN_TYPE_KEYW_BUILTIN_NUMBER = 149;
    i32 TOKEN_TYPE_KEYW_OBJECT = 150;
    i32 TOKEN_TYPE_KEYW_BUILTIN_OBJECT = 151;
    i32 TOKEN_TYPE_KEYW_OF = 152;
    i32 TOKEN_TYPE_KEYW_FINAL = 153;
    i32 TOKEN_TYPE_KEYW_OUT = 154;
    i32 TOKEN_TYPE_KEYW_OVERLOAD = 155;
    i32 TOKEN_TYPE_KEYW_OVERRIDE = 156;
    i32 TOKEN_TYPE_KEYW_PACKAGE = 157;
    i32 TOKEN_TYPE_KEYW_PRIVATE = 158;
    i32 TOKEN_TYPE_KEYW_PROTECTED = 159;
    i32 TOKEN_TYPE_KEYW_PUBLIC = 160;
    i32 TOKEN_TYPE_KEYW_READONLY = 161;
    i32 TOKEN_TYPE_KEYW_RETURN = 162;
    i32 TOKEN_TYPE_KEYW_REQUIRE = 163;
    i32 TOKEN_TYPE_KEYW_SET = 164;
    i32 TOKEN_TYPE_KEYW_SHORT = 165;
    i32 TOKEN_TYPE_KEYW_BUILTIN_SHORT = 166;
    i32 TOKEN_TYPE_KEYW_STATIC = 167;
    i32 TOKEN_TYPE_KEYW_STRING = 168;
    i32 TOKEN_TYPE_KEYW_BUILTIN_STRING = 169;
    i32 TOKEN_TYPE_KEYW_STRUCT = 170;
    i32 TOKEN_TYPE_KEYW_SUPER = 171;
    i32 TOKEN_TYPE_KEYW_SWITCH = 172;
    i32 TOKEN_TYPE_KEYW_TARGET = 173;
    i32 TOKEN_TYPE_KEYW_THIS = 174;
    i32 TOKEN_TYPE_KEYW_THROW = 175;
    i32 TOKEN_TYPE_LITERAL_TRUE = 176;
    i32 TOKEN_TYPE_KEYW_TRY = 177;
    i32 TOKEN_TYPE_KEYW_TYPE = 178;
    i32 TOKEN_TYPE_KEYW_TYPEOF = 179;
    i32 TOKEN_TYPE_KEYW_U8 = 180;
    i32 TOKEN_TYPE_KEYW_U16 = 181;
    i32 TOKEN_TYPE_KEYW_U32 = 182;
    i32 TOKEN_TYPE_KEYW_U64 = 183;
    i32 TOKEN_TYPE_KEYW_UNDEFINED = 184;
    i32 TOKEN_TYPE_KEYW_UNKNOWN = 185;
    i32 TOKEN_TYPE_KEYW_USIZE = 186;
    i32 TOKEN_TYPE_KEYW_V128 = 187;
    i32 TOKEN_TYPE_KEYW_VAR = 188;
    i32 TOKEN_TYPE_KEYW_VOID = 189;
    i32 TOKEN_TYPE_KEYW_WHILE = 190;
    i32 TOKEN_TYPE_KEYW_WITH = 191;
    i32 TOKEN_TYPE_KEYW_YIELD = 192;
    i32 TOKEN_TYPE_FIRST_PUNCTUATOR = 6;
    i32 TOKEN_TYPE_FIRST_KEYW = 68;
};

dictionary Es2pandaAstNodeFlags {
    i32 AST_NODE_FLAGS_NO_OPTS = 0;
    i32 AST_NODE_FLAGS_REST_ARGUMENT = 1;
    i32 AST_NODE_FLAGS_ALLOW_REQUIRED_INSTANTIATION = 2;
    i32 AST_NODE_FLAGS_GENERATE_VALUE_OF = 4;
    i32 AST_NODE_FLAGS_RECHECK = 8;
    i32 AST_NODE_FLAGS_NOCLEANUP = 16;
    i32 AST_NODE_FLAGS_DEFAULT_PARAM = 32;
    i32 AST_NODE_FLAGS_IS_GROUPED = 64;
};

dictionary Es2pandaModifierFlags {
    i32 MODIFIER_FLAGS_NONE = 0;
    i32 MODIFIER_FLAGS_STATIC = 1;
    i32 MODIFIER_FLAGS_ASYNC = 2;
    i32 MODIFIER_FLAGS_PUBLIC = 4;
    i32 MODIFIER_FLAGS_PROTECTED = 8;
    i32 MODIFIER_FLAGS_PRIVATE = 16;
    i32 MODIFIER_FLAGS_DECLARE = 32;
    i32 MODIFIER_FLAGS_READONLY = 64;
    i32 MODIFIER_FLAGS_OPTIONAL = 128;
    i32 MODIFIER_FLAGS_DEFINITE = 256;
    i32 MODIFIER_FLAGS_ABSTRACT = 512;
    i32 MODIFIER_FLAGS_CONST = 1024;
    i32 MODIFIER_FLAGS_FINAL = 2048;
    i32 MODIFIER_FLAGS_NATIVE = 4096;
    i32 MODIFIER_FLAGS_OVERRIDE = 8192;
    i32 MODIFIER_FLAGS_CONSTRUCTOR = 16384;
    i32 MODIFIER_FLAGS_SYNCHRONIZED = 32768;
    i32 MODIFIER_FLAGS_FUNCTIONAL = 65536;
    i32 MODIFIER_FLAGS_IN = 131072;
    i32 MODIFIER_FLAGS_OUT = 262144;
    i32 MODIFIER_FLAGS_INTERNAL = 524288;
    i32 MODIFIER_FLAGS_EXPORT = 1048576;
    i32 MODIFIER_FLAGS_GETTER = 2097152;
    i32 MODIFIER_FLAGS_SETTER = 4194304;
    i32 MODIFIER_FLAGS_DEFAULT_EXPORT = 8388608;
    i32 MODIFIER_FLAGS_EXPORT_TYPE = 16777216;
    i32 MODIFIER_FLAGS_SUPER_OWNER = 33554432;
    i32 MODIFIER_FLAGS_ANNOTATION_DECLARATION = 67108864;
    i32 MODIFIER_FLAGS_ANNOTATION_USAGE = 134217728;
    i32 MODIFIER_FLAGS_READONLY_PARAMETER = 268435456;
    i32 MODIFIER_FLAGS_EXPORT_WITH_ALIAS = 536870912;
    i32 MODIFIER_FLAGS_DEFAULT = 1073741824;
    i32 MODIFIER_FLAGS_ACCESS = 524316;
    i32 MODIFIER_FLAGS_ALL = 524927;
    i32 MODIFIER_FLAGS_ALLOWED_IN_CTOR_PARAMETER = 524380;
    i32 MODIFIER_FLAGS_INTERNAL_PROTECTED = 524296;
    i32 MODIFIER_FLAGS_ACCESSOR_MODIFIERS = 2560;
    i32 MODIFIER_FLAGS_GETTER_SETTER = 6291456;
    i32 MODIFIER_FLAGS_EXPORTED = 26214400;
};

dictionary Es2pandaPrivateFieldKind {
    i32 PRIVATE_FIELD_KIND_FIELD = 0;
    i32 PRIVATE_FIELD_KIND_METHOD = 1;
    i32 PRIVATE_FIELD_KIND_GET = 2;
    i32 PRIVATE_FIELD_KIND_SET = 3;
    i32 PRIVATE_FIELD_KIND_STATIC_FIELD = 4;
    i32 PRIVATE_FIELD_KIND_STATIC_METHOD = 5;
    i32 PRIVATE_FIELD_KIND_STATIC_GET = 6;
    i32 PRIVATE_FIELD_KIND_STATIC_SET = 7;
    i32 PRIVATE_FIELD_KIND_OVERLOAD = 8;
    i32 PRIVATE_FIELD_KIND_STATIC_OVERLOAD = 9;
};

dictionary Es2pandaScriptFunctionFlags {
    i32 SCRIPT_FUNCTION_FLAGS_NONE = 0;
    i32 SCRIPT_FUNCTION_FLAGS_GENERATOR = 1;
    i32 SCRIPT_FUNCTION_FLAGS_ASYNC = 2;
    i32 SCRIPT_FUNCTION_FLAGS_ARROW = 4;
    i32 SCRIPT_FUNCTION_FLAGS_EXPRESSION = 8;
    i32 SCRIPT_FUNCTION_FLAGS_OVERLOAD = 16;
    i32 SCRIPT_FUNCTION_FLAGS_CONSTRUCTOR = 32;
    i32 SCRIPT_FUNCTION_FLAGS_METHOD = 64;
    i32 SCRIPT_FUNCTION_FLAGS_STATIC_BLOCK = 128;
    i32 SCRIPT_FUNCTION_FLAGS_HIDDEN = 256;
    i32 SCRIPT_FUNCTION_FLAGS_IMPLICIT_SUPER_CALL_NEEDED = 512;
    i32 SCRIPT_FUNCTION_FLAGS_ENUM = 1024;
    i32 SCRIPT_FUNCTION_FLAGS_EXTERNAL = 2048;
    i32 SCRIPT_FUNCTION_FLAGS_PROXY = 4096;
    i32 SCRIPT_FUNCTION_FLAGS_THROWS = 8192;
    i32 SCRIPT_FUNCTION_FLAGS_RETHROWS = 16384;
    i32 SCRIPT_FUNCTION_FLAGS_GETTER = 32768;
    i32 SCRIPT_FUNCTION_FLAGS_SETTER = 65536;
    i32 SCRIPT_FUNCTION_FLAGS_ENTRY_POINT = 131072;
    i32 SCRIPT_FUNCTION_FLAGS_HAS_RETURN = 262144;
    i32 SCRIPT_FUNCTION_FLAGS_ASYNC_IMPL = 524288;
    i32 SCRIPT_FUNCTION_FLAGS_EXTERNAL_OVERLOAD = 1048576;
    i32 SCRIPT_FUNCTION_FLAGS_HAS_THROW = 2097152;
    i32 SCRIPT_FUNCTION_FLAGS_IN_RECORD = 4194304;
    i32 SCRIPT_FUNCTION_FLAGS_TRAILING_LAMBDA = 8388608;
    i32 SCRIPT_FUNCTION_FLAGS_SYNTHETIC = 16777216;
    i32 SCRIPT_FUNCTION_FLAGS_RETURN_PROMISEVOID = 33554432;
    i32 SCRIPT_FUNCTION_FLAGS_EXPLICIT_THIS_CALL = 67108864;
    i32 SCRIPT_FUNCTION_FLAGS_EXPLICIT_SUPER_CALL = 134217728;
    i32 SCRIPT_FUNCTION_FLAGS_INTERFACE_PROPERTY = 268435456;
};

dictionary Es2pandaTSOperatorType {
    i32 TS_OPERATOR_TYPE_READONLY = 0;
    i32 TS_OPERATOR_TYPE_KEYOF = 1;
    i32 TS_OPERATOR_TYPE_UNIQUE = 2;
};

dictionary Es2pandaMappedOption {
    i32 MAPPED_OPTION_NO_OPTS = 0;
    i32 MAPPED_OPTION_PLUS = 1;
    i32 MAPPED_OPTION_MINUS = 2;
};

dictionary Es2pandaClassDefinitionModifiers {
    i32 CLASS_DEFINITION_MODIFIERS_NONE = 0;
    i32 CLASS_DEFINITION_MODIFIERS_DECLARATION = 1;
    i32 CLASS_DEFINITION_MODIFIERS_ID_REQUIRED = 2;
    i32 CLASS_DEFINITION_MODIFIERS_GLOBAL = 4;
    i32 CLASS_DEFINITION_MODIFIERS_HAS_SUPER = 8;
    i32 CLASS_DEFINITION_MODIFIERS_SET_CTOR_ID = 16;
    i32 CLASS_DEFINITION_MODIFIERS_EXTERN = 32;
    i32 CLASS_DEFINITION_MODIFIERS_ANONYMOUS = 64;
    i32 CLASS_DEFINITION_MODIFIERS_GLOBAL_INITIALIZED = 128;
    i32 CLASS_DEFINITION_MODIFIERS_CLASS_DECL = 256;
    i32 CLASS_DEFINITION_MODIFIERS_INNER = 512;
    i32 CLASS_DEFINITION_MODIFIERS_FROM_EXTERNAL = 1024;
    i32 CLASS_DEFINITION_MODIFIERS_LOCAL = 2048;
    i32 CLASS_DEFINITION_MODIFIERS_CLASSDEFINITION_CHECKED = 4096;
    i32 CLASS_DEFINITION_MODIFIERS_NAMESPACE_TRANSFORMED = 8192;
    i32 CLASS_DEFINITION_MODIFIERS_STRING_ENUM_TRANSFORMED = 16384;
    i32 CLASS_DEFINITION_MODIFIERS_NUMERIC_ENUM_TRANSFORMED = 32768;
    i32 CLASS_DEFINITION_MODIFIERS_FROM_STRUCT = 65536;
    i32 CLASS_DEFINITION_MODIFIERS_FUNCTIONAL_REFERENCE = 131072;
    i32 CLASS_DEFINITION_MODIFIERS_LAZY_IMPORT_OBJECT_CLASS = 262144;
    i32 CLASS_DEFINITION_MODIFIERS_INIT_IN_CCTOR = 524288;
    i32 CLASS_DEFINITION_MODIFIERS_DECLARATION_ID_REQUIRED = 3;
    i32 CLASS_DEFINITION_MODIFIERS_ETS_MODULE = 8196;
};

dictionary Es2pandaOperandKind {
    i32 OPERAND_KIND_SRC_VREG = 0;
    i32 OPERAND_KIND_DST_VREG = 1;
    i32 OPERAND_KIND_SRC_DST_VREG = 2;
    i32 OPERAND_KIND_IMM = 3;
    i32 OPERAND_KIND_ID = 4;
    i32 OPERAND_KIND_STRING_ID = 5;
    i32 OPERAND_KIND_LABEL = 6;
    i32 OPERAND_KIND_NONE = 7;
};

dictionary Es2pandaOperandType {
    i32 OPERAND_TYPE_REF = 0;
    i32 OPERAND_TYPE_B32 = 1;
    i32 OPERAND_TYPE_B64 = 2;
    i32 OPERAND_TYPE_ANY = 3;
    i32 OPERAND_TYPE_NONE = 4;
};

dictionary Es2pandaTypeRelationFlag {
    i32 TYPE_RELATION_FLAG_NONE = 0;
    i32 TYPE_RELATION_FLAG_CAPTURE = 1;
    i32 TYPE_RELATION_FLAG_STRING = 2;
    i32 TYPE_RELATION_FLAG_VALUE_SET = 4;
    i32 TYPE_RELATION_FLAG_UNCHECKED = 8;
    i32 TYPE_RELATION_FLAG_SELF_REFERENCE = 16;
    i32 TYPE_RELATION_FLAG_NO_RETURN_TYPE_CHECK = 32;
    i32 TYPE_RELATION_FLAG_DIRECT_RETURN = 64;
    i32 TYPE_RELATION_FLAG_IN_ASSIGNMENT_CONTEXT = 128;
    i32 TYPE_RELATION_FLAG_IN_CASTING_CONTEXT = 256;
    i32 TYPE_RELATION_FLAG_UNCHECKED_CAST = 512;
    i32 TYPE_RELATION_FLAG_IGNORE_TYPE_PARAMETERS = 1024;
    i32 TYPE_RELATION_FLAG_CHECK_PROXY = 2048;
    i32 TYPE_RELATION_FLAG_NO_CHECK_TRAILING_LAMBDA = 4096;
    i32 TYPE_RELATION_FLAG_NO_THROW_GENERIC_TYPEALIAS = 8192;
    i32 TYPE_RELATION_FLAG_OVERRIDING_CONTEXT = 16384;
    i32 TYPE_RELATION_FLAG_IGNORE_REST_PARAM = 32768;
    i32 TYPE_RELATION_FLAG_STRING_TO_CHAR = 65536;
    i32 TYPE_RELATION_FLAG_OVERLOADING_CONTEXT = 131072;
    i32 TYPE_RELATION_FLAG_NO_SUBSTITUTION_NEEDED = 262144;
    i32 TYPE_RELATION_FLAG_ASSIGNMENT_CONTEXT = 0;
    i32 TYPE_RELATION_FLAG_BRIDGE_CHECK = 17408;
    i32 TYPE_RELATION_FLAG_CASTING_CONTEXT = 512;
};

dictionary Es2pandaRelationResult {
    i32 RELATION_RESULT_TRUE = 0;
    i32 RELATION_RESULT_FALSE = 1;
    i32 RELATION_RESULT_UNKNOWN = 2;
    i32 RELATION_RESULT_MAYBE = 3;
    i32 RELATION_RESULT_CACHE_MISS = 4;
    i32 RELATION_RESULT_ERROR = 5;
};

dictionary Es2pandaRelationType {
    i32 RELATION_TYPE_COMPARABLE = 0;
    i32 RELATION_TYPE_ASSIGNABLE = 1;
    i32 RELATION_TYPE_IDENTICAL = 2;
    i32 RELATION_TYPE_UNCHECKED_CASTABLE = 3;
    i32 RELATION_TYPE_SUPERTYPE = 4;
};

dictionary Es2pandaVarianceFlag {
    i32 VARIANCE_FLAG_COVARIANT = 0;
    i32 VARIANCE_FLAG_CONTRAVARIANT = 1;
    i32 VARIANCE_FLAG_INVARIANT = 2;
};

dictionary Es2pandaImportKinds {
    i32 IMPORT_KINDS_ALL = 0;
    i32 IMPORT_KINDS_TYPES = 1;
};


typedef u64 Es2pandaTypeFlag;

dictionary Es2pandaPropertyKind {
    i32 PROPERTY_KIND_INIT = 0;
    i32 PROPERTY_KIND_GET = 1;
    i32 PROPERTY_KIND_SET = 2;
    i32 PROPERTY_KIND_PROTO = 3;
};

dictionary Es2pandaConstant {
    i32 CONSTANT_PROP_NULL = 0;
    i32 CONSTANT_PROP_UNDEFINED = 1;
    i32 CONSTANT_EMPTY_ARRAY = 2;
};

dictionary Es2pandaTSSignatureDeclarationKind {
    i32 TS_SIGNATURE_DECLARATION_KIND_CALL_SIGNATURE = 0;
    i32 TS_SIGNATURE_DECLARATION_KIND_CONSTRUCT_SIGNATURE = 1;
};

dictionary Es2pandaInitMode {
    i32 INIT_MODE_NONE = 0;
    i32 INIT_MODE_IMMEDIATE_INIT = 1;
    i32 INIT_MODE_NEED_INIT_IN_STATIC_BLOCK = 2;
};

dictionary Es2pandaTSIndexSignatureKind {
    i32 TS_INDEX_SIGNATURE_KIND_NUMBER = 0;
    i32 TS_INDEX_SIGNATURE_KIND_STRING = 1;
};

dictionary Es2pandaEnumLiteralTypeKind {
    i32 ENUM_LITERAL_TYPE_KIND_NUMERIC = 0;
    i32 ENUM_LITERAL_TYPE_KIND_LITERAL = 1;
};

dictionary Es2pandaIdentifierFlags {
    i32 IDENTIFIER_FLAGS_NONE = 0;
    i32 IDENTIFIER_FLAGS_OPTIONAL = 1;
    i32 IDENTIFIER_FLAGS_TDZ = 2;
    i32 IDENTIFIER_FLAGS_PRIVATE = 4;
    i32 IDENTIFIER_FLAGS_GET = 8;
    i32 IDENTIFIER_FLAGS_SET = 16;
    i32 IDENTIFIER_FLAGS_IGNORE_BOX = 32;
    i32 IDENTIFIER_FLAGS_ANNOTATIONDECL = 64;
    i32 IDENTIFIER_FLAGS_ANNOTATIONUSAGE = 128;
    i32 IDENTIFIER_FLAGS_ERROR_PLACEHOLDER = 256;
};

dictionary Es2pandaMemberExpressionKind {
    i32 MEMBER_EXPRESSION_KIND_NONE = 0;
    i32 MEMBER_EXPRESSION_KIND_ELEMENT_ACCESS = 1;
    i32 MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS = 2;
    i32 MEMBER_EXPRESSION_KIND_GETTER = 4;
    i32 MEMBER_EXPRESSION_KIND_SETTER = 8;
    i32 MEMBER_EXPRESSION_KIND_EXTENSION_ACCESSOR = 16;
};

dictionary Es2pandaTSTupleKind {
    i32 TS_TUPLE_KIND_NONE = 0;
    i32 TS_TUPLE_KIND_NAMED = 1;
    i32 TS_TUPLE_KIND_DEFAULT = 2;
};

dictionary Es2pandaMetaPropertyKind {
    i32 META_PROPERTY_KIND_NEW_TARGET = 0;
    i32 META_PROPERTY_KIND_IMPORT_META = 1;
};

dictionary Es2pandaModuleFlag {
    i32 MODULE_FLAG_NONE = 0;
    i32 MODULE_FLAG_ETSSCRIPT = 1;
    i32 MODULE_FLAG_NAMESPACE = 2;
    i32 MODULE_FLAG_NAMESPACE_CHAIN_LAST_NODE = 4;
};

dictionary Es2pandaElementFlags {
    i32 ELEMENT_FLAGS_NO_OPTS = 0;
    i32 ELEMENT_FLAGS_REQUIRED = 1;
    i32 ELEMENT_FLAGS_OPTIONAL = 2;
    i32 ELEMENT_FLAGS_REST = 4;
    i32 ELEMENT_FLAGS_VARIADIC = 8;
    i32 ELEMENT_FLAGS_FIXED = 3;
    i32 ELEMENT_FLAGS_VARIABLE = 12;
    i32 ELEMENT_FLAGS_NON_REQUIRED = 14;
    i32 ELEMENT_FLAGS_NON_REST = 11;
};

dictionary Es2pandaSignatureFlags {
    i32 SIGNATURE_FLAGS_NO_OPTS = 0;
    i32 SIGNATURE_FLAGS_ABSTRACT = 1;
    i32 SIGNATURE_FLAGS_CALL = 2;
    i32 SIGNATURE_FLAGS_CONSTRUCT = 4;
    i32 SIGNATURE_FLAGS_PUBLIC = 8;
    i32 SIGNATURE_FLAGS_PROTECTED = 16;
    i32 SIGNATURE_FLAGS_PRIVATE = 32;
    i32 SIGNATURE_FLAGS_STATIC = 64;
    i32 SIGNATURE_FLAGS_FINAL = 128;
    i32 SIGNATURE_FLAGS_CONSTRUCTOR = 256;
    i32 SIGNATURE_FLAGS_PROXY = 512;
    i32 SIGNATURE_FLAGS_NEED_RETURN_TYPE = 1024;
    i32 SIGNATURE_FLAGS_INFERRED_RETURN_TYPE = 2048;
    i32 SIGNATURE_FLAGS_THIS_RETURN_TYPE = 4096;
    i32 SIGNATURE_FLAGS_GETTER = 8192;
    i32 SIGNATURE_FLAGS_SETTER = 16384;
    i32 SIGNATURE_FLAGS_THROWS = 32768;
    i32 SIGNATURE_FLAGS_RETHROWS = 65536;
    i32 SIGNATURE_FLAGS_EXTENSION_FUNCTION = 131072;
    i32 SIGNATURE_FLAGS_DUPLICATE_ASM = 262144;
    i32 SIGNATURE_FLAGS_BRIDGE = 524288;
    i32 SIGNATURE_FLAGS_DEFAULT = 1048576;
    i32 SIGNATURE_FLAGS_GETTER_OR_SETTER = 24576;
    i32 SIGNATURE_FLAGS_THROWING = 98304;
};

dictionary Es2pandaPrimitiveType {
    i32 PRIMITIVE_TYPE_BYTE = 0;
    i32 PRIMITIVE_TYPE_INT = 1;
    i32 PRIMITIVE_TYPE_LONG = 2;
    i32 PRIMITIVE_TYPE_SHORT = 3;
    i32 PRIMITIVE_TYPE_FLOAT = 4;
    i32 PRIMITIVE_TYPE_DOUBLE = 5;
    i32 PRIMITIVE_TYPE_BOOLEAN = 6;
    i32 PRIMITIVE_TYPE_CHAR = 7;
    i32 PRIMITIVE_TYPE_VOID = 8;
};

dictionary Es2pandaObjectFlags {
    i32 OBJECT_FLAGS_NO_OPTS = 0;
    i32 OBJECT_FLAGS_CHECK_EXCESS_PROPS = 1;
    i32 OBJECT_FLAGS_RESOLVED_MEMBERS = 2;
    i32 OBJECT_FLAGS_RESOLVED_BASE_TYPES = 4;
    i32 OBJECT_FLAGS_RESOLVED_DECLARED_MEMBERS = 8;
};

dictionary Es2pandaObjectTypeKind {
    i32 OBJECT_TYPE_KIND_LITERAL = 0;
    i32 OBJECT_TYPE_KIND_CLASS = 1;
    i32 OBJECT_TYPE_KIND_INTERFACE = 2;
    i32 OBJECT_TYPE_KIND_TUPLE = 3;
    i32 OBJECT_TYPE_KIND_FUNCTION = 4;
};

dictionary Es2pandaVariableDeclaratorFlag {
    i32 VARIABLE_DECLARATOR_FLAG_LET = 0;
    i32 VARIABLE_DECLARATOR_FLAG_CONST = 1;
    i32 VARIABLE_DECLARATOR_FLAG_VAR = 2;
    i32 VARIABLE_DECLARATOR_FLAG_UNKNOWN = 3;
};

dictionary Es2pandaTypeFacts {
    i32 TYPE_FACTS_NONE = 0;
    i32 TYPE_FACTS_TYPEOF_EQ_STRING = 1;
    i32 TYPE_FACTS_TYPEOF_EQ_NUMBER = 2;
    i32 TYPE_FACTS_TYPEOF_EQ_BIGINT = 4;
    i32 TYPE_FACTS_TYPEOF_EQ_BOOLEAN = 8;
    i32 TYPE_FACTS_TYPEOF_EQ_SYMBOL = 16;
    i32 TYPE_FACTS_TYPEOF_EQ_OBJECT = 32;
    i32 TYPE_FACTS_TYPEOF_EQ_FUNCTION = 64;
    i32 TYPE_FACTS_TYPEOF_EQ_HOST_OBJECT = 128;
    i32 TYPE_FACTS_TYPEOF_NE_STRING = 256;
    i32 TYPE_FACTS_TYPEOF_NE_NUMBER = 512;
    i32 TYPE_FACTS_TYPEOF_NE_BIGINT = 1024;
    i32 TYPE_FACTS_TYPEOF_NE_BOOLEAN = 2048;
    i32 TYPE_FACTS_TYPEOF_NE_SYMBOL = 4096;
    i32 TYPE_FACTS_TYPEOF_NE_OBJECT = 8192;
    i32 TYPE_FACTS_TYPEOF_NE_FUNCTION = 16384;
    i32 TYPE_FACTS_TYPEOF_NE_HOST_OBJECT = 32768;
    i32 TYPE_FACTS_EQ_UNDEFINED = 65536;
    i32 TYPE_FACTS_EQ_NULL = 131072;
    i32 TYPE_FACTS_EQ_UNDEFINED_OR_NULL = 262144;
    i32 TYPE_FACTS_NE_UNDEFINED = 524288;
    i32 TYPE_FACTS_NE_NULL = 1048576;
    i32 TYPE_FACTS_NE_UNDEFINED_OR_NULL = 2097152;
    i32 TYPE_FACTS_TRUTHY = 4194304;
    i32 TYPE_FACTS_FALSY = 8388608;
    i32 TYPE_FACTS_ALL = 16777216;
    i32 TYPE_FACTS_LAST = 8388608;
    i32 TYPE_FACTS_BASE_NUMBER_STRICT_FACTS = 3734786;
    i32 TYPE_FACTS_BASE_NUMBER_FACTS = 12582146;
    i32 TYPE_FACTS_NUMBER_FACTS = 16776450;
    i32 TYPE_FACTS_ZERO_NUMBER_STRICT_FACTS = 12123394;
    i32 TYPE_FACTS_ZERO_NUMBER_FACTS = 12582146;
    i32 TYPE_FACTS_NON_ZERO_NUMBER_FACTS = 16776450;
    i32 TYPE_FACTS_BASE_STRING_STRICT_FACTS = 3735041;
    i32 TYPE_FACTS_BASE_STRING_FACTS = 12582401;
    i32 TYPE_FACTS_STRING_FACTS = 16776705;
    i32 TYPE_FACTS_EMPTY_STRING_STRICT_FACTS = 16317953;
    i32 TYPE_FACTS_EMPTY_STRING_FACTS = 12582401;
    i32 TYPE_FACTS_NON_EMPTY_STRING_FACTS = 16776705;
    i32 TYPE_FACTS_BASE_BIGINT_STRICT_FACTS = 3734276;
    i32 TYPE_FACTS_BASE_BIGINT_FACTS = 12581636;
    i32 TYPE_FACTS_BIGINT_FACTS = 16775940;
    i32 TYPE_FACTS_ZERO_BIGINT_STRICT_FACTS = 12122884;
    i32 TYPE_FACTS_ZERO_BIGINT_FACTS = 12581636;
    i32 TYPE_FACTS_NON_ZERO_BIGINT_FACTS = 16775940;
    i32 TYPE_FACTS_BASE_BOOLEAN_STRICT_FACTS = 3733256;
    i32 TYPE_FACTS_BASE_BOOLEAN_FACTS = 12580616;
    i32 TYPE_FACTS_BOOLEAN_FACTS = 16774920;
    i32 TYPE_FACTS_FALSE_STRICT_FACTS = 12121864;
    i32 TYPE_FACTS_FALSE_FACTS = 12580616;
    i32 TYPE_FACTS_TRUE_STRICT_FACTS = 7927560;
    i32 TYPE_FACTS_TRUE_FACTS = 16774920;
    i32 TYPE_FACTS_OBJECT_STRICT_FACTS = 7888800;
    i32 TYPE_FACTS_OBJECT_FACTS = 16736160;
    i32 TYPE_FACTS_EMPTY_OBJECT_FACTS = 16777216;
    i32 TYPE_FACTS_FUNCTION_STRICT_FACTS = 7880640;
    i32 TYPE_FACTS_FUNCTION_FACTS = 16728000;
    i32 TYPE_FACTS_UNDEFINED_FACTS = 9830144;
    i32 TYPE_FACTS_NULL_FACTS = 9363232;
};

dictionary Es2pandaGlobalTypeId {
    i32 GLOBAL_TYPE_ID_NUMBER = 0;
    i32 GLOBAL_TYPE_ID_ANY = 1;
    i32 GLOBAL_TYPE_ID_STRING = 2;
    i32 GLOBAL_TYPE_ID_BOOLEAN = 3;
    i32 GLOBAL_TYPE_ID_VOID = 4;
    i32 GLOBAL_TYPE_ID_NULL_ID = 5;
    i32 GLOBAL_TYPE_ID_UNDEFINED = 6;
    i32 GLOBAL_TYPE_ID_UNKNOWN = 7;
    i32 GLOBAL_TYPE_ID_NEVER = 8;
    i32 GLOBAL_TYPE_ID_NON_PRIMITIVE = 9;
    i32 GLOBAL_TYPE_ID_BIGINT = 10;
    i32 GLOBAL_TYPE_ID_FALSE_ID = 11;
    i32 GLOBAL_TYPE_ID_TRUE_ID = 12;
    i32 GLOBAL_TYPE_ID_NUMBER_OR_BIGINT = 13;
    i32 GLOBAL_TYPE_ID_STRING_OR_NUMBER = 14;
    i32 GLOBAL_TYPE_ID_ZERO = 15;
    i32 GLOBAL_TYPE_ID_EMPTY_STRING = 16;
    i32 GLOBAL_TYPE_ID_ZERO_BIGINT = 17;
    i32 GLOBAL_TYPE_ID_PRIMITIVE = 18;
    i32 GLOBAL_TYPE_ID_EMPTY_TUPLE = 19;
    i32 GLOBAL_TYPE_ID_EMPTY_OBJECT = 20;
    i32 GLOBAL_TYPE_ID_RESOLVING_RETURN_TYPE = 21;
    i32 GLOBAL_TYPE_ID_ERROR_TYPE = 22;
    i32 GLOBAL_TYPE_ID_BYTE = 23;
    i32 GLOBAL_TYPE_ID_SHORT = 24;
    i32 GLOBAL_TYPE_ID_INT = 25;
    i32 GLOBAL_TYPE_ID_LONG = 26;
    i32 GLOBAL_TYPE_ID_FLOAT = 27;
    i32 GLOBAL_TYPE_ID_DOUBLE = 28;
    i32 GLOBAL_TYPE_ID_CHAR = 29;
    i32 GLOBAL_TYPE_ID_ETS_BOOLEAN = 30;
    i32 GLOBAL_TYPE_ID_ETS_STRING = 31;
    i32 GLOBAL_TYPE_ID_ETS_VOID = 32;
    i32 GLOBAL_TYPE_ID_ETS_OBJECT_BUILTIN = 33;
    i32 GLOBAL_TYPE_ID_ETS_NULL = 34;
    i32 GLOBAL_TYPE_ID_ETS_UNDEFINED = 35;
    i32 GLOBAL_TYPE_ID_ETS_UNION_UNDEFINED_NULL = 36;
    i32 GLOBAL_TYPE_ID_ETS_ANY = 37;
    i32 GLOBAL_TYPE_ID_ETS_RELAXED_ANY = 38;
    i32 GLOBAL_TYPE_ID_ETS_NEVER = 39;
    i32 GLOBAL_TYPE_ID_ETS_UNION_UNDEFINED_NULL_OBJECT = 40;
    i32 GLOBAL_TYPE_ID_ETS_WILDCARD = 41;
    i32 GLOBAL_TYPE_ID_ETS_BOOLEAN_BUILTIN = 42;
    i32 GLOBAL_TYPE_ID_ETS_BYTE_BUILTIN = 43;
    i32 GLOBAL_TYPE_ID_ETS_CLASS_BUILTIN = 44;
    i32 GLOBAL_TYPE_ID_ETS_CHAR_BUILTIN = 45;
    i32 GLOBAL_TYPE_ID_ETS_COMPARABLE_BUILTIN = 46;
    i32 GLOBAL_TYPE_ID_ETS_CONSOLE_BUILTIN = 47;
    i32 GLOBAL_TYPE_ID_ETS_DATE_BUILTIN = 48;
    i32 GLOBAL_TYPE_ID_ETS_DOUBLE_BUILTIN = 49;
    i32 GLOBAL_TYPE_ID_ETS_EXCEPTION_BUILTIN = 50;
    i32 GLOBAL_TYPE_ID_ETS_FLOAT_BUILTIN = 51;
    i32 GLOBAL_TYPE_ID_ETS_FLOATING_BUILTIN = 52;
    i32 GLOBAL_TYPE_ID_ETS_INT_BUILTIN = 53;
    i32 GLOBAL_TYPE_ID_ETS_INTEGRAL_BUILTIN = 54;
    i32 GLOBAL_TYPE_ID_ETS_LONG_BUILTIN = 55;
    i32 GLOBAL_TYPE_ID_ETS_NUMERIC_BUILTIN = 56;
    i32 GLOBAL_TYPE_ID_ETS_MAP_BUILTIN = 57;
    i32 GLOBAL_TYPE_ID_ETS_RECORD_BUILTIN = 58;
    i32 GLOBAL_TYPE_ID_ETS_ERROR_BUILTIN = 59;
    i32 GLOBAL_TYPE_ID_ETS_RUNTIME_BUILTIN = 60;
    i32 GLOBAL_TYPE_ID_ETS_RUNTIME_LINKER_BUILTIN = 61;
    i32 GLOBAL_TYPE_ID_ETS_SET_BUILTIN = 62;
    i32 GLOBAL_TYPE_ID_ETS_SHORT_BUILTIN = 63;
    i32 GLOBAL_TYPE_ID_ETS_STACK_TRACE_ELEMENT_BUILTIN = 64;
    i32 GLOBAL_TYPE_ID_ETS_STACK_TRACE_BUILTIN = 65;
    i32 GLOBAL_TYPE_ID_ETS_ARRAY_INDEX_OUT_OF_BOUNDS_ERROR_BUILTIN = 66;
    i32 GLOBAL_TYPE_ID_ETS_ARITHMETIC_ERROR_BUILTIN = 67;
    i32 GLOBAL_TYPE_ID_ETS_CLASS_CAST_ERROR_BUILTIN = 68;
    i32 GLOBAL_TYPE_ID_ETS_ASSERTION_ERROR_BUILTIN = 69;
    i32 GLOBAL_TYPE_ID_ETS_DIVIDE_BY_ZERO_ERROR_BUILTIN = 70;
    i32 GLOBAL_TYPE_ID_ETS_NULL_POINTER_ERROR_BUILTIN = 71;
    i32 GLOBAL_TYPE_ID_ETS_UNCAUGHT_EXCEPTION_ERROR_BUILTIN = 72;
    i32 GLOBAL_TYPE_ID_ETS_STRING_BUILTIN = 73;
    i32 GLOBAL_TYPE_ID_ETS_STRING_BUILDER_BUILTIN = 74;
    i32 GLOBAL_TYPE_ID_ETS_TYPE_BUILTIN = 75;
    i32 GLOBAL_TYPE_ID_ETS_TYPES_BUILTIN = 76;
    i32 GLOBAL_TYPE_ID_ETS_PROMISE_BUILTIN = 77;
    i32 GLOBAL_TYPE_ID_ETS_PROMISELIKE_BUILTIN = 78;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION_BUILTIN = 79;
    i32 GLOBAL_TYPE_ID_ETS_REGEXP_BUILTIN = 80;
    i32 GLOBAL_TYPE_ID_ETS_ARRAY_BUILTIN = 81;
    i32 GLOBAL_TYPE_ID_ETS_BOX_BUILTIN = 82;
    i32 GLOBAL_TYPE_ID_ETS_BOOLEAN_BOX_BUILTIN = 83;
    i32 GLOBAL_TYPE_ID_ETS_BYTE_BOX_BUILTIN = 84;
    i32 GLOBAL_TYPE_ID_ETS_CHAR_BOX_BUILTIN = 85;
    i32 GLOBAL_TYPE_ID_ETS_SHORT_BOX_BUILTIN = 86;
    i32 GLOBAL_TYPE_ID_ETS_INT_BOX_BUILTIN = 87;
    i32 GLOBAL_TYPE_ID_ETS_LONG_BOX_BUILTIN = 88;
    i32 GLOBAL_TYPE_ID_ETS_FLOAT_BOX_BUILTIN = 89;
    i32 GLOBAL_TYPE_ID_ETS_DOUBLE_BOX_BUILTIN = 90;
    i32 GLOBAL_TYPE_ID_ETS_BIG_INT_BUILTIN = 91;
    i32 GLOBAL_TYPE_ID_ETS_BIG_INT = 92;
    i32 GLOBAL_TYPE_ID_ETS_ARRAY = 93;
    i32 GLOBAL_TYPE_ID_ETS_READONLY_ARRAY = 94;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION0_CLASS = 95;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION1_CLASS = 96;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION2_CLASS = 97;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION3_CLASS = 98;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION4_CLASS = 99;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION5_CLASS = 100;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION6_CLASS = 101;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION7_CLASS = 102;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION8_CLASS = 103;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION9_CLASS = 104;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION10_CLASS = 105;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION11_CLASS = 106;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION12_CLASS = 107;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION13_CLASS = 108;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION14_CLASS = 109;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION15_CLASS = 110;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTION16_CLASS = 111;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONN_CLASS = 112;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA0_CLASS = 113;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA1_CLASS = 114;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA2_CLASS = 115;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA3_CLASS = 116;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA4_CLASS = 117;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA5_CLASS = 118;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA6_CLASS = 119;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA7_CLASS = 120;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA8_CLASS = 121;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA9_CLASS = 122;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA10_CLASS = 123;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA11_CLASS = 124;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA12_CLASS = 125;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA13_CLASS = 126;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA14_CLASS = 127;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA15_CLASS = 128;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDA16_CLASS = 129;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAN_CLASS = 130;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR0_CLASS = 131;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR1_CLASS = 132;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR2_CLASS = 133;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR3_CLASS = 134;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR4_CLASS = 135;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR5_CLASS = 136;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR6_CLASS = 137;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR7_CLASS = 138;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR8_CLASS = 139;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR9_CLASS = 140;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR10_CLASS = 141;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR11_CLASS = 142;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR12_CLASS = 143;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR13_CLASS = 144;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR14_CLASS = 145;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR15_CLASS = 146;
    i32 GLOBAL_TYPE_ID_ETS_FUNCTIONR16_CLASS = 147;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR0_CLASS = 148;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR1_CLASS = 149;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR2_CLASS = 150;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR3_CLASS = 151;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR4_CLASS = 152;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR5_CLASS = 153;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR6_CLASS = 154;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR7_CLASS = 155;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR8_CLASS = 156;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR9_CLASS = 157;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR10_CLASS = 158;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR11_CLASS = 159;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR12_CLASS = 160;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR13_CLASS = 161;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR14_CLASS = 162;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR15_CLASS = 163;
    i32 GLOBAL_TYPE_ID_ETS_LAMBDAR16_CLASS = 164;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE0_CLASS = 165;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE1_CLASS = 166;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE2_CLASS = 167;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE3_CLASS = 168;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE4_CLASS = 169;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE5_CLASS = 170;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE6_CLASS = 171;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE7_CLASS = 172;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE8_CLASS = 173;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE9_CLASS = 174;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE10_CLASS = 175;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE11_CLASS = 176;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE12_CLASS = 177;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE13_CLASS = 178;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE14_CLASS = 179;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE15_CLASS = 180;
    i32 GLOBAL_TYPE_ID_ETS_TUPLE16_CLASS = 181;
    i32 GLOBAL_TYPE_ID_ETS_TUPLEN_CLASS = 182;
    i32 GLOBAL_TYPE_ID_TYPE_ERROR = 183;
    i32 GLOBAL_TYPE_ID_COUNT = 184;
};

dictionary Es2pandaMethodDefinitionKind {
    i32 METHOD_DEFINITION_KIND_NONE = 0;
    i32 METHOD_DEFINITION_KIND_CONSTRUCTOR = 1;
    i32 METHOD_DEFINITION_KIND_METHOD = 2;
    i32 METHOD_DEFINITION_KIND_EXTENSION_METHOD = 3;
    i32 METHOD_DEFINITION_KIND_GET = 4;
    i32 METHOD_DEFINITION_KIND_SET = 5;
    i32 METHOD_DEFINITION_KIND_EXTENSION_GET = 6;
    i32 METHOD_DEFINITION_KIND_EXTENSION_SET = 7;
};

dictionary Es2pandaOverloadDeclFlags {
    i32 OVERLOAD_DECL_FLAGS_NONE = 0;
    i32 OVERLOAD_DECL_FLAGS_FUNCTION = 1;
    i32 OVERLOAD_DECL_FLAGS_CLASS_METHOD = 2;
    i32 OVERLOAD_DECL_FLAGS_INTERFACE_METHOD = 4;
};


typedef u64 Es2pandaETSObjectFlags;

dictionary Es2pandaPropertySearchFlags {
    i32 PROPERTY_SEARCH_FLAGS_NO_OPTS = 0;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_INSTANCE_METHOD = 1;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_INSTANCE_FIELD = 2;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_INSTANCE_DECL = 4;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_STATIC_METHOD = 8;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_STATIC_FIELD = 16;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_STATIC_DECL = 32;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_IN_BASE = 64;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_IN_INTERFACES = 128;
    i32 PROPERTY_SEARCH_FLAGS_IGNORE_ABSTRACT = 256;
    i32 PROPERTY_SEARCH_FLAGS_ALLOW_FUNCTIONAL_INTERFACE = 512;
    i32 PROPERTY_SEARCH_FLAGS_DISALLOW_SYNTHETIC_METHOD_CREATION = 1024;
    i32 PROPERTY_SEARCH_FLAGS_IS_SETTER = 2048;
    i32 PROPERTY_SEARCH_FLAGS_IS_GETTER = 4096;
    i32 PROPERTY_SEARCH_FLAGS_IGNORE_OVERLOAD = 8192;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_INSTANCE = 7;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_STATIC = 56;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_METHOD = 9;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_FIELD = 18;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_DECL = 36;
    i32 PROPERTY_SEARCH_FLAGS_SEARCH_ALL = 63;
};

dictionary Es2pandaPropertyType {
    i32 PROPERTY_TYPE_INSTANCE_METHOD = 0;
    i32 PROPERTY_TYPE_INSTANCE_FIELD = 1;
    i32 PROPERTY_TYPE_INSTANCE_DECL = 2;
    i32 PROPERTY_TYPE_STATIC_METHOD = 3;
    i32 PROPERTY_TYPE_STATIC_FIELD = 4;
    i32 PROPERTY_TYPE_STATIC_DECL = 5;
    i32 PROPERTY_TYPE_COUNT = 6;
};

dictionary Es2pandaVariableDeclarationKind {
    i32 VARIABLE_DECLARATION_KIND_CONST = 0;
    i32 VARIABLE_DECLARATION_KIND_LET = 1;
    i32 VARIABLE_DECLARATION_KIND_VAR = 2;
};

dictionary Es2pandaAccessibilityOption {
    i32 ACCESSIBILITY_OPTION_NO_OPTS = 0;
    i32 ACCESSIBILITY_OPTION_PUBLIC = 1;
    i32 ACCESSIBILITY_OPTION_PRIVATE = 2;
    i32 ACCESSIBILITY_OPTION_PROTECTED = 3;
};

dictionary Es2pandaRetentionPolicy {
    i32 RETENTION_POLICY_SOURCE = 0;
    i32 RETENTION_POLICY_BYTECODE = 1;
    i32 RETENTION_POLICY_RUNTIME = 2;
};

dictionary Es2pandaAnnotationTargets {
    i32 ANNOTATION_TARGETS_NONE = 0;
    i32 ANNOTATION_TARGETS_CLASS = 1;
    i32 ANNOTATION_TARGETS_ENUMERATION = 2;
    i32 ANNOTATION_TARGETS_FUNCTION = 4;
    i32 ANNOTATION_TARGETS_FUNCTION_WITH_RECEIVER = 8;
    i32 ANNOTATION_TARGETS_INTERFACE = 16;
    i32 ANNOTATION_TARGETS_NAMESPACE = 32;
    i32 ANNOTATION_TARGETS_TYPE_ALIAS = 64;
    i32 ANNOTATION_TARGETS_VARIABLE = 128;
    i32 ANNOTATION_TARGETS_CLASS_FIELD = 256;
    i32 ANNOTATION_TARGETS_CLASS_METHOD = 512;
    i32 ANNOTATION_TARGETS_CLASS_GETTER = 1024;
    i32 ANNOTATION_TARGETS_CLASS_SETTER = 2048;
    i32 ANNOTATION_TARGETS_INTERFACE_PROPERTY = 4096;
    i32 ANNOTATION_TARGETS_INTERFACE_METHOD = 8192;
    i32 ANNOTATION_TARGETS_INTERFACE_GETTER = 16384;
    i32 ANNOTATION_TARGETS_INTERFACE_SETTER = 32768;
    i32 ANNOTATION_TARGETS_LAMBDA = 65536;
    i32 ANNOTATION_TARGETS_PARAMETER = 131072;
    i32 ANNOTATION_TARGETS_STRUCT = 262144;
    i32 ANNOTATION_TARGETS_TYPE = 524288;
};

dictionary Es2pandaRecordTableFlags {
    i32 RECORD_TABLE_FLAGS_NONE = 0;
    i32 RECORD_TABLE_FLAGS_EXTERNAL = 1;
};

dictionary Es2pandaCheckerStatus {
    i32 CHECKER_STATUS_NO_OPTS = 0;
    i32 CHECKER_STATUS_FORCE_TUPLE = 1;
    i32 CHECKER_STATUS_IN_CONST_CONTEXT = 2;
    i32 CHECKER_STATUS_KEEP_LITERAL_TYPE = 4;
    i32 CHECKER_STATUS_IN_PARAMETER = 8;
    i32 CHECKER_STATUS_IN_CLASS = 16;
    i32 CHECKER_STATUS_IN_INTERFACE = 32;
    i32 CHECKER_STATUS_IN_ABSTRACT = 64;
    i32 CHECKER_STATUS_IN_STATIC_CONTEXT = 128;
    i32 CHECKER_STATUS_IN_CONSTRUCTOR = 256;
    i32 CHECKER_STATUS_IN_STATIC_BLOCK = 512;
    i32 CHECKER_STATUS_INNER_CLASS = 1024;
    i32 CHECKER_STATUS_IN_ENUM = 2048;
    i32 CHECKER_STATUS_BUILTINS_INITIALIZED = 4096;
    i32 CHECKER_STATUS_IN_LAMBDA = 8192;
    i32 CHECKER_STATUS_IGNORE_VISIBILITY = 16384;
    i32 CHECKER_STATUS_IN_EXTENSION_METHOD = 32768;
    i32 CHECKER_STATUS_IN_LOCAL_CLASS = 65536;
    i32 CHECKER_STATUS_IN_INSTANCEOF_CONTEXT = 131072;
    i32 CHECKER_STATUS_IN_TEST_EXPRESSION = 262144;
    i32 CHECKER_STATUS_IN_LOOP = 524288;
    i32 CHECKER_STATUS_MEET_RETURN = 1048576;
    i32 CHECKER_STATUS_MEET_BREAK = 2097152;
    i32 CHECKER_STATUS_MEET_CONTINUE = 4194304;
    i32 CHECKER_STATUS_MEET_THROW = 8388608;
    i32 CHECKER_STATUS_IN_EXTERNAL = 16777216;
    i32 CHECKER_STATUS_IN_BRIDGE_TEST = 33554432;
    i32 CHECKER_STATUS_IN_GETTER = 67108864;
    i32 CHECKER_STATUS_IN_SETTER = 134217728;
    i32 CHECKER_STATUS_IN_EXTENSION_ACCESSOR_CHECK = 268435456;
    i32 CHECKER_STATUS_IN_TYPE_INFER = 536870912;
    i32 CHECKER_STATUS_RESTRICTED_RETURN_IN_BLOCK = 1073741824;
};

dictionary Es2pandaResolvedKind {
    i32 RESOLVED_KIND_PROPERTY = 0;
    i32 RESOLVED_KIND_EXTENSION_FUNCTION = 1;
    i32 RESOLVED_KIND_EXTENSION_ACCESSOR = 2;
};

dictionary Es2pandaLexicalScopeType {
    i32 LEXICAL_SCOPE_TYPE_BLOCK = 0;
    i32 LEXICAL_SCOPE_TYPE_STRICT_BLOCK = 1;
    i32 LEXICAL_SCOPE_TYPE_CATCH = 2;
    i32 LEXICAL_SCOPE_TYPE_FUNCTION_PARAM = 3;
    i32 LEXICAL_SCOPE_TYPE_TS_TYPE_LITERAL = 4;
};

dictionary Es2pandaVariableParsingFlags {
    i32 VARIABLE_PARSING_FLAGS_NO_OPTS = 0;
    i32 VARIABLE_PARSING_FLAGS_NO_SKIP_VAR_KIND = 1;
    i32 VARIABLE_PARSING_FLAGS_ACCEPT_CONST_NO_INIT = 2;
    i32 VARIABLE_PARSING_FLAGS_DISALLOW_INIT = 4;
    i32 VARIABLE_PARSING_FLAGS_VAR = 8;
    i32 VARIABLE_PARSING_FLAGS_LET = 16;
    i32 VARIABLE_PARSING_FLAGS_CONST = 32;
    i32 VARIABLE_PARSING_FLAGS_STOP_AT_IN = 64;
    i32 VARIABLE_PARSING_FLAGS_IN_FOR = 128;
    i32 VARIABLE_PARSING_FLAGS_FOR_OF = 256;
};

dictionary Es2pandaExpressionParseFlags {
    i32 EXPRESSION_PARSE_FLAGS_NO_OPTS = 0;
    i32 EXPRESSION_PARSE_FLAGS_ACCEPT_COMMA = 1;
    i32 EXPRESSION_PARSE_FLAGS_ACCEPT_REST = 2;
    i32 EXPRESSION_PARSE_FLAGS_EXP_DISALLOW_AS = 4;
    i32 EXPRESSION_PARSE_FLAGS_DISALLOW_ASSIGNMENT = 8;
    i32 EXPRESSION_PARSE_FLAGS_DISALLOW_YIELD = 16;
    i32 EXPRESSION_PARSE_FLAGS_STOP_AT_IN = 32;
    i32 EXPRESSION_PARSE_FLAGS_MUST_BE_PATTERN = 64;
    i32 EXPRESSION_PARSE_FLAGS_POTENTIALLY_IN_PATTERN = 128;
    i32 EXPRESSION_PARSE_FLAGS_OBJECT_PATTERN = 256;
    i32 EXPRESSION_PARSE_FLAGS_IN_REST = 512;
    i32 EXPRESSION_PARSE_FLAGS_IMPORT = 1024;
    i32 EXPRESSION_PARSE_FLAGS_POTENTIAL_CLASS_LITERAL = 2048;
    i32 EXPRESSION_PARSE_FLAGS_IN_FOR = 4096;
    i32 EXPRESSION_PARSE_FLAGS_INSTANCEOF = 8192;
    i32 EXPRESSION_PARSE_FLAGS_POTENTIAL_NEW_ARRAY = 16384;
};

dictionary Es2pandaStatementParsingFlags {
    i32 STATEMENT_PARSING_FLAGS_NONE = 0;
    i32 STATEMENT_PARSING_FLAGS_ALLOW_LEXICAL = 1;
    i32 STATEMENT_PARSING_FLAGS_GLOBAL = 2;
    i32 STATEMENT_PARSING_FLAGS_IF_ELSE = 4;
    i32 STATEMENT_PARSING_FLAGS_LABELLED = 8;
    i32 STATEMENT_PARSING_FLAGS_INIT_MODULE = 16;
    i32 STATEMENT_PARSING_FLAGS_STMT_LEXICAL_SCOPE_NEEDED = 12;
    i32 STATEMENT_PARSING_FLAGS_STMT_GLOBAL_LEXICAL = 3;
};

dictionary Es2pandaForStatementKind {
    i32 FOR_STATEMENT_KIND_UPDATE = 0;
    i32 FOR_STATEMENT_KIND_IN = 1;
    i32 FOR_STATEMENT_KIND_OF = 2;
};

dictionary Es2pandaTypeAnnotationParsingOptions {
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_NO_OPTS = 0;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_IN_UNION = 1;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ALLOW_CONST = 2;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_IN_INTERSECTION = 4;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_RESTRICT_EXTENDS = 8;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_REPORT_ERROR = 16;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_CAN_BE_TS_TYPE_PREDICATE = 32;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_BREAK_AT_NEW_LINE = 64;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_RETURN_TYPE = 128;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_POTENTIAL_CLASS_LITERAL = 256;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ALLOW_INTERSECTION = 512;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ADD_TYPE_PARAMETER_BINDING = 1024;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_DISALLOW_PRIMARY_TYPE = 2048;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ALLOW_WILDCARD = 4096;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_IGNORE_FUNCTION_TYPE = 8192;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ALLOW_DECLARATION_SITE_VARIANCE = 16384;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_DISALLOW_UNION = 32768;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_POTENTIAL_NEW_ARRAY = 65536;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_ANNOTATION_NOT_ALLOW = 131072;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_INSTANCEOF = 262144;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_TYPE_ALIAS_CONTEXT = 524288;
    i32 TYPE_ANNOTATION_PARSING_OPTIONS_IGNORE_KEYW_KEYOF = 1048576;
};

dictionary Es2pandaParseListOptions {
    i32 PARSE_LIST_OPTIONS_NO_OPT = 0;
    i32 PARSE_LIST_OPTIONS_ALLOW_TRAILING_SEP = 1;
    i32 PARSE_LIST_OPTIONS_ALLOW_TYPE_KEYWORD = 2;
};

dictionary Es2pandaCompilationMode {
    i32 COMPILATION_MODE_GEN_STD_LIB = 0;
    i32 COMPILATION_MODE_PROJECT = 1;
    i32 COMPILATION_MODE_SINGLE_FILE = 2;
    i32 COMPILATION_MODE_GEN_ABC_FOR_EXTERNAL_SOURCE = 3;
};

dictionary Es2pandaModuleKind {
    i32 MODULE_KIND_UNKNOWN = 0;
    i32 MODULE_KIND_PACKAGE = 1;
    i32 MODULE_KIND_MODULE = 2;
    i32 MODULE_KIND_SOURCE_DECL = 3;
    i32 MODULE_KIND_ETSCACHE_DECL = 4;
    i32 MODULE_KIND_DECLLESS_DYNAMIC = 5;
    i32 MODULE_KIND_SIMULT_MAIN = 6;
};



// COMPARE_MANUAL_CAPI_AND_IDL_START
interface es2panda_Impl {
    void MemInitialize();
    void MemFinalize();
    es2panda_Config CreateConfig(i32 argc, sequence<String> argv);
    void DestroyConfig(es2panda_Config config);
    void DestroyConfigWithoutLog(es2panda_Config config);
    String GetAllErrorMessages(es2panda_Context context);
    util.Options ConfigGetOptions(es2panda_Config config);

    es2panda_Context CreateContextFromFile(es2panda_Config config, String source_file_name);
    es2panda_Context CreateCacheContextFromFile(es2panda_Config config, String source_file_name, es2panda_GlobalContext globalContext, boolean isExternal);
    es2panda_Context CreateContextFromString(es2panda_Config config, String source, String file_name);
    es2panda_Context CreateContextFromStringWithHistory(es2panda_Config config, String source, String file_name);
    es2panda_Context CreateCacheContextFromString(es2panda_Config config, String source, String file_name, es2panda_GlobalContext globalContext, boolean isExternal, boolean isLspUsage);
    es2panda_Context CreateContextGenerateAbcForExternalSourceFiles(es2panda_Config config, i32 fileNamesCount, sequence<String> fileNames);
    es2panda_Context ProceedToState(es2panda_Context context, es2panda_ContextState state);  // context is consumed
    void DestroyContext(es2panda_Context context);
    es2panda_GlobalContext CreateGlobalContext(es2panda_Config config, sequence<String> externalFileList, u32 fileNum, boolean LspUsage);
    void DestroyGlobalContext(es2panda_GlobalContext globalContext);

    es2panda_ContextState ContextState(es2panda_Context context);
    String ContextErrorMessage(es2panda_Context context);

    parser.Program ContextProgram(es2panda_Context context);
    sequence<es2panda_ExternalSource> ProgramExternalSources(es2panda_Context context, parser.Program program);
    sequence<es2panda_ExternalSource> ProgramDirectExternalSources(es2panda_Context context, parser.Program program);
    String ExternalSourceName(es2panda_ExternalSource e_source);
    sequence<parser.Program> ExternalSourcePrograms(es2panda_ExternalSource e_source);

    void AstNodeForEach(ir.AstNode ast, AstNodeForEachFunction func, VoidPtr arg);
    String NumberLiteralStrConst(es2panda_Context context, ir.AstNode classInstance);
    VoidPtr AllocMemory(es2panda_Context context, u32 numberOfElements, u32 sizeOfElement);

    es2panda_SourcePosition CreateSourcePosition(es2panda_Context context, u32 index, u32 line);
    es2panda_SourceRange CreateSourceRange(es2panda_Context context, es2panda_SourcePosition start,
                                               es2panda_SourcePosition end);
    u32 SourcePositionCol(es2panda_Context context, es2panda_SourcePosition position);
    u32 SourcePositionIndex(es2panda_Context context, es2panda_SourcePosition position);
    u32 SourcePositionLine(es2panda_Context context, es2panda_SourcePosition position);
    es2panda_SourcePosition SourceRangeStart(es2panda_Context context, es2panda_SourceRange range);
    es2panda_SourcePosition SourceRangeEnd(es2panda_Context context, es2panda_SourceRange range);
    es2panda_DiagnosticKind CreateDiagnosticKind(es2panda_Context context, String dmessage,
                                                           es2panda_PluginDiagnosticType etype);
    es2panda_DiagnosticInfo CreateDiagnosticInfo(es2panda_Context context, es2panda_DiagnosticKind kind,
                                        sequence<String> args, u32 argc, es2panda_SourcePosition position);
    es2panda_SuggestionInfo CreateSuggestionInfo(es2panda_Context context, es2panda_DiagnosticKind kind,
                                        sequence<String> args, u32 argc, String substitutionCode,
                                        String message, es2panda_SourceRange range);
    void LogDiagnosticWithSuggestions(es2panda_Context context, es2panda_DiagnosticInfo diagnosticInfo,
                                        sequence<es2panda_SuggestionInfo> suggestionInfos, u32 suggestionCount);
    void LogDiagnosticWithSuggestion(es2panda_Context context, es2panda_DiagnosticInfo diagnosticInfo,
                                        es2panda_SuggestionInfo suggestionInfo);
    void LogDiagnostic(es2panda_Context context, es2panda_DiagnosticKind kind, sequence<String> args,
                          u32 argc, es2panda_SourcePosition pos);
    es2panda_DiagnosticStorage GetSemanticErrors(es2panda_Context ctx);
    es2panda_DiagnosticStorage GetSyntaxErrors(es2panda_Context ctx);
    es2panda_DiagnosticStorage GetPluginErrors(es2panda_Context ctx);
    es2panda_DiagnosticStorage GetWarnings(es2panda_Context ctx);
    boolean IsAnyError(es2panda_Context context);
    varbinder.Scope AstNodeFindNearestScope(es2panda_Context ctx, ir.AstNode node);
    varbinder.Scope AstNodeRebind(es2panda_Context ctx, ir.AstNode node);
    void AstNodeRecheck(es2panda_Context ctx, ir.AstNode node);
    Es2pandaEnum Es2pandaEnumFromString(es2panda_Context ctx, String str);
    String Es2pandaEnumToString(es2panda_Context ctx, Es2pandaEnum id);
    ir.AstNode DeclarationFromIdentifier(es2panda_Context ctx, ir.Identifier node);
    boolean IsImportTypeKind(es2panda_Context ctx, ir.AstNode node);
    String JsdocStringFromDeclaration(es2panda_Context ctx, ir.AstNode node);
    String GetLicenseFromRootNode(es2panda_Context ctx, ir.AstNode node);
    ir.AstNode FirstDeclarationByNameFromNode(es2panda_Context ctx, ir.AstNode node, String name);
    ir.AstNode FirstDeclarationByNameFromProgram(es2panda_Context ctx, parser.Program program, String name);
    sequence<ir.AstNode> AllDeclarationsByNameFromNode(es2panda_Context ctx, ir.AstNode node, String name);
    sequence<ir.AstNode> AllDeclarationsByNameFromProgram(es2panda_Context ctx, parser.Program program, String name);
    i32 GenerateTsDeclarationsFromContext(es2panda_Context ctx, String outputDeclEts, String outputEts,
                                          boolean exportAll, boolean isolated, String recordFile,
                                          boolean genAnnotations);
    void InsertETSImportDeclarationAndParse(es2panda_Context context, parser.Program program,
                                            ir.ETSImportDeclaration node);
    i32 GenerateStaticDeclarationsFromContext(es2panda_Context context, String outputPath);
    void InvalidateFileCache(es2panda_GlobalContext globalContext, String fileName);
    void RemoveFileCache(es2panda_GlobalContext globalContext, String fileName);
    void AddFileCache(es2panda_GlobalContext globalContext, String fileName);
    void FreeCompilerPartMemory(es2panda_Context context);
// COMPARE_MANUAL_CAPI_AND_IDL_END

    boolean IsExpression(ir.AstNode ast);
    boolean IsStatement(ir.AstNode ast);
    boolean IsArrowFunctionExpression(ir.AstNode ast);
    boolean IsAnnotationDeclaration(ir.AstNode ast);
    boolean IsAnnotationUsage(ir.AstNode ast);
    boolean IsAssertStatement(ir.AstNode ast);
    boolean IsAwaitExpression(ir.AstNode ast);
    boolean IsBigIntLiteral(ir.AstNode ast);
    boolean IsBinaryExpression(ir.AstNode ast);
    boolean IsBlockStatement(ir.AstNode ast);
    boolean IsBooleanLiteral(ir.AstNode ast);
    boolean IsBreakStatement(ir.AstNode ast);
    boolean IsCallExpression(ir.AstNode ast);
    boolean IsCatchClause(ir.AstNode ast);
    boolean IsChainExpression(ir.AstNode ast);
    boolean IsCharLiteral(ir.AstNode ast);
    boolean IsClassDefinition(ir.AstNode ast);
    boolean IsClassDeclaration(ir.AstNode ast);
    boolean IsClassExpression(ir.AstNode ast);
    boolean IsClassProperty(ir.AstNode ast);
    boolean IsClassStaticBlock(ir.AstNode ast);
    boolean IsConditionalExpression(ir.AstNode ast);
    boolean IsContinueStatement(ir.AstNode ast);
    boolean IsDebuggerStatement(ir.AstNode ast);
    boolean IsDecorator(ir.AstNode ast);
    boolean IsDirectEvalExpression(ir.AstNode ast);
    boolean IsDoWhileStatement(ir.AstNode ast);
    boolean IsEmptyStatement(ir.AstNode ast);
    boolean IsExportAllDeclaration(ir.AstNode ast);
    boolean IsExportDefaultDeclaration(ir.AstNode ast);
    boolean IsExportNamedDeclaration(ir.AstNode ast);
    boolean IsExportSpecifier(ir.AstNode ast);
    boolean IsExpressionStatement(ir.AstNode ast);
    boolean IsForInStatement(ir.AstNode ast);
    boolean IsForOfStatement(ir.AstNode ast);
    boolean IsForUpdateStatement(ir.AstNode ast);
    boolean IsFunctionDeclaration(ir.AstNode ast);
    boolean IsFunctionExpression(ir.AstNode ast);
    boolean IsIdentifier(ir.AstNode ast);
    boolean IsDummyNode(ir.AstNode ast);
    boolean IsIfStatement(ir.AstNode ast);
    boolean IsImportDeclaration(ir.AstNode ast);
    boolean IsImportExpression(ir.AstNode ast);
    boolean IsImportDefaultSpecifier(ir.AstNode ast);
    boolean IsImportNamespaceSpecifier(ir.AstNode ast);
    boolean IsImportSpecifier(ir.AstNode ast);
    boolean IsLabelledStatement(ir.AstNode ast);
    boolean IsMemberExpression(ir.AstNode ast);
    boolean IsMetaProperty(ir.AstNode ast);
    boolean IsMethodDefinition(ir.AstNode ast);
    boolean IsNamedType(ir.AstNode ast);
    boolean IsNewExpression(ir.AstNode ast);
    boolean IsNullLiteral(ir.AstNode ast);
    boolean IsUndefinedLiteral(ir.AstNode ast);
    boolean IsNumberLiteral(ir.AstNode ast);
    boolean IsOmittedExpression(ir.AstNode ast);
    boolean IsOverloadDeclaration(ir.AstNode ast);
    boolean IsPrefixAssertionExpression(ir.AstNode ast);
    boolean IsProperty(ir.AstNode ast);
    boolean IsRegExpLiteral(ir.AstNode ast);
    boolean IsETSReExportDeclaration(ir.AstNode ast);
    boolean IsReturnStatement(ir.AstNode ast);
    boolean IsScriptFunction(ir.AstNode ast);
    boolean IsSequenceExpression(ir.AstNode ast);
    boolean IsStringLiteral(ir.AstNode ast);
    boolean IsETSNonNullishTypeNode(ir.AstNode ast);
    boolean IsETSNullType(ir.AstNode ast);
    boolean IsETSUndefinedType(ir.AstNode ast);
    boolean IsETSNeverType(ir.AstNode ast);
    boolean IsETSStringLiteralType(ir.AstNode ast);
    boolean IsETSIntrinsicNode(ir.AstNode ast);
    boolean IsETSFunctionType(ir.AstNode ast);
    boolean IsETSWildcardType(ir.AstNode ast);
    boolean IsETSGenericInstantiatedNode(ir.AstNode ast);
    boolean IsETSPrimitiveType(ir.AstNode ast);
    boolean IsETSPackageDeclaration(ir.AstNode ast);
    boolean IsETSClassLiteral(ir.AstNode ast);
    boolean IsETSTypeReference(ir.AstNode ast);
    boolean IsETSTypeReferencePart(ir.AstNode ast);
    boolean IsETSDestructuring(ir.AstNode ast);
    boolean IsETSUnionType(ir.AstNode ast);
    boolean IsETSKeyofType(ir.AstNode ast);
    boolean IsETSNewArrayInstanceExpression(ir.AstNode ast);
    boolean IsETSNewMultiDimArrayInstanceExpression(ir.AstNode ast);
    boolean IsETSNewClassInstanceExpression(ir.AstNode ast);
    boolean IsETSImportDeclaration(ir.AstNode ast);
    boolean IsETSParameterExpression(ir.AstNode ast);
    boolean IsETSTuple(ir.AstNode ast);
    boolean IsETSModule(ir.AstNode ast);
    boolean IsSuperExpression(ir.AstNode ast);
    boolean IsETSStructDeclaration(ir.AstNode ast);
    boolean IsSwitchCaseStatement(ir.AstNode ast);
    boolean IsSwitchStatement(ir.AstNode ast);
    boolean IsTSEnumDeclaration(ir.AstNode ast);
    boolean IsTSEnumMember(ir.AstNode ast);
    boolean IsTSExternalModuleReference(ir.AstNode ast);
    boolean IsTSNumberKeyword(ir.AstNode ast);
    boolean IsTSAnyKeyword(ir.AstNode ast);
    boolean IsTSStringKeyword(ir.AstNode ast);
    boolean IsTSBooleanKeyword(ir.AstNode ast);
    boolean IsTSVoidKeyword(ir.AstNode ast);
    boolean IsTSUndefinedKeyword(ir.AstNode ast);
    boolean IsTSUnknownKeyword(ir.AstNode ast);
    boolean IsTSObjectKeyword(ir.AstNode ast);
    boolean IsTSBigintKeyword(ir.AstNode ast);
    boolean IsTSNeverKeyword(ir.AstNode ast);
    boolean IsTSNonNullExpression(ir.AstNode ast);
    boolean IsTSNullKeyword(ir.AstNode ast);
    boolean IsTSArrayType(ir.AstNode ast);
    boolean IsTSUnionType(ir.AstNode ast);
    boolean IsTSTypeLiteral(ir.AstNode ast);
    boolean IsTSPropertySignature(ir.AstNode ast);
    boolean IsTSMethodSignature(ir.AstNode ast);
    boolean IsTSSignatureDeclaration(ir.AstNode ast);
    boolean IsTSParenthesizedType(ir.AstNode ast);
    boolean IsTSLiteralType(ir.AstNode ast);
    boolean IsTSInferType(ir.AstNode ast);
    boolean IsTSConditionalType(ir.AstNode ast);
    boolean IsTSImportType(ir.AstNode ast);
    boolean IsTSIntersectionType(ir.AstNode ast);
    boolean IsTSMappedType(ir.AstNode ast);
    boolean IsTSModuleBlock(ir.AstNode ast);
    boolean IsTSThisType(ir.AstNode ast);
    boolean IsTSTypeOperator(ir.AstNode ast);
    boolean IsTSTypeParameter(ir.AstNode ast);
    boolean IsTSTypeParameterDeclaration(ir.AstNode ast);
    boolean IsTSTypeParameterInstantiation(ir.AstNode ast);
    boolean IsTSTypePredicate(ir.AstNode ast);
    boolean IsTSParameterProperty(ir.AstNode ast);
    boolean IsTSModuleDeclaration(ir.AstNode ast);
    boolean IsTSImportEqualsDeclaration(ir.AstNode ast);
    boolean IsTSFunctionType(ir.AstNode ast);
    boolean IsTSConstructorType(ir.AstNode ast);
    boolean IsTSTypeAliasDeclaration(ir.AstNode ast);
    boolean IsTSTypeReference(ir.AstNode ast);
    boolean IsTSQualifiedName(ir.AstNode ast);
    boolean IsTSIndexedAccessType(ir.AstNode ast);
    boolean IsTSInterfaceDeclaration(ir.AstNode ast);
    boolean IsTSInterfaceBody(ir.AstNode ast);
    boolean IsTSInterfaceHeritage(ir.AstNode ast);
    boolean IsTSTupleType(ir.AstNode ast);
    boolean IsTSNamedTupleMember(ir.AstNode ast);
    boolean IsTSIndexSignature(ir.AstNode ast);
    boolean IsTSTypeQuery(ir.AstNode ast);
    boolean IsTSAsExpression(ir.AstNode ast);
    boolean IsTSClassImplements(ir.AstNode ast);
    boolean IsTSTypeAssertion(ir.AstNode ast);
    boolean IsTaggedTemplateExpression(ir.AstNode ast);
    boolean IsTemplateElement(ir.AstNode ast);
    boolean IsTemplateLiteral(ir.AstNode ast);
    boolean IsThisExpression(ir.AstNode ast);
    boolean IsTypeofExpression(ir.AstNode ast);
    boolean IsThrowStatement(ir.AstNode ast);
    boolean IsTryStatement(ir.AstNode ast);
    boolean IsUnaryExpression(ir.AstNode ast);
    boolean IsUpdateExpression(ir.AstNode ast);
    boolean IsVariableDeclaration(ir.AstNode ast);
    boolean IsVariableDeclarator(ir.AstNode ast);
    boolean IsWhileStatement(ir.AstNode ast);
    boolean IsYieldExpression(ir.AstNode ast);
    boolean IsOpaqueTypeNode(ir.AstNode ast);
    boolean IsBlockExpression(ir.AstNode ast);
    boolean IsBrokenTypeNode(ir.AstNode ast);
    boolean IsArrayExpression(ir.AstNode ast);
    boolean IsArrayPattern(ir.AstNode ast);
    boolean IsAssignmentExpression(ir.AstNode ast);
    boolean IsAssignmentPattern(ir.AstNode ast);
    boolean IsObjectExpression(ir.AstNode ast);
    boolean IsObjectPattern(ir.AstNode ast);
    boolean IsSpreadElement(ir.AstNode ast);
    boolean IsRestElement(ir.AstNode ast);

    boolean ScopeIsVariableScope(varbinder.Scope scope);
    boolean ScopeIsParamScope(varbinder.Scope scope);
    boolean ScopeIsCatchParamScope(varbinder.Scope scope);
    boolean ScopeIsFunctionParamScope(varbinder.Scope scope);
    boolean ScopeIsCatchScope(varbinder.Scope scope);
    boolean ScopeIsClassScope(varbinder.Scope scope);
    boolean ScopeIsAnnotationScope(varbinder.Scope scope);
    boolean ScopeIsAnnotationParamScope(varbinder.Scope scope);
    boolean ScopeIsLocalScope(varbinder.Scope scope);
    boolean ScopeIsLoopScope(varbinder.Scope scope);
    boolean ScopeIsLoopDeclarationScope(varbinder.Scope scope);
    boolean ScopeIsFunctionScope(varbinder.Scope scope);
    boolean ScopeIsGlobalScope(varbinder.Scope scope);
    boolean ScopeIsModuleScope(varbinder.Scope scope);

    boolean TypeIsArrayType(checker.Type type);
    boolean TypeIsAnyType(checker.Type type);
    boolean TypeIsBigintLiteralType(checker.Type type);
    boolean TypeIsNumberType(checker.Type type);
    boolean TypeIsStringType(checker.Type type);
    boolean TypeIsBooleanType(checker.Type type);
    boolean TypeIsVoidType(checker.Type type);
    boolean TypeIsNullType(checker.Type type);
    boolean TypeIsUndefinedType(checker.Type type);
    boolean TypeIsUnknownType(checker.Type type);
    boolean TypeIsNeverType(checker.Type type);
    boolean TypeIsUnionType(checker.Type type);
    boolean TypeIsObjectType(checker.Type type);
    boolean TypeIsBigintType(checker.Type type);
    boolean TypeIsBooleanLiteralType(checker.Type type);
    boolean TypeIsNumberLiteralType(checker.Type type);
    boolean TypeIsStringLiteralType(checker.Type type);
    boolean TypeIsEnumType(checker.Type type);
    boolean TypeIsEnumLiteralType(checker.Type type);
    boolean TypeIsTypeParameter(checker.Type type);
    boolean TypeIsTypeReference(checker.Type type);
    boolean TypeIsByteType(checker.Type type);
    boolean TypeIsShortType(checker.Type type);
    boolean TypeIsIntType(checker.Type type);
    boolean TypeIsLongType(checker.Type type);
    boolean TypeIsFloatType(checker.Type type);
    boolean TypeIsDoubleType(checker.Type type);
    boolean TypeIsCharType(checker.Type type);
    boolean TypeIsETSBooleanType(checker.Type type);
    boolean TypeIsETSVoidType(checker.Type type);
    boolean TypeIsETSNullType(checker.Type type);
    boolean TypeIsETSUndefinedType(checker.Type type);
    boolean TypeIsETSAnyType(checker.Type type);
    boolean TypeIsETSNeverType(checker.Type type);
    boolean TypeIsETSFunctionType(checker.Type type);
    boolean TypeIsETSObjectType(checker.Type type);
    boolean TypeIsETSArrayType(checker.Type type);
    boolean TypeIsETSUnionType(checker.Type type);
    boolean TypeIsNonPrimitiveType(checker.Type type);
    boolean TypeIsWildcardType(checker.Type type);
    boolean TypeIsETSTypeParameter(checker.Type type);
    boolean TypeIsETSNonNullishType(checker.Type type);
    boolean TypeIsETSReadonlyType(checker.Type type);
    boolean TypeIsETSAwaitedType(checker.Type type);
    boolean TypeIsETSReturnTypeUtilityType(checker.Type type);
    boolean TypeIsETSNumericEnumType(checker.Type type);
    boolean TypeIsETSStringEnumType(checker.Type type);
    boolean TypeIsETSEnumType(checker.Type type);
    boolean TypeIsETSExtensionFuncHelperType(checker.Type type);
    boolean TypeIsETSTupleType(checker.Type type);
    boolean TypeIsETSPartialTypeParameter(checker.Type type);
    boolean TypeIsTypeError(checker.Type type);
    boolean TypeIsETSTypeAliasType(checker.Type type);

    boolean VariableIsLocalVariable(varbinder.Variable variable);
    boolean VariableIsGlobalVariable(varbinder.Variable variable);
    boolean VariableIsModuleVariable(varbinder.Variable variable);
    boolean VariableIsEnumVariable(varbinder.Variable variable);

    String AstNodeName(ir.AstNode ast);
};


namespace ir {

[Entity=Class, Es2pandaAstNodeType=52, c_type=es2panda_AstNode] interface NumberLiteral: Literal {
    ir.AstNode Create(es2panda_Context ctx, i32 value);
    ir.AstNode Create1(es2panda_Context ctx, i64 value);
    ir.AstNode Create2(es2panda_Context ctx, f64 value);
    ir.AstNode Create3(es2panda_Context ctx, f32 value);

    ir.AstNode Update(es2panda_Context ctx, ir.AstNode original, i32 value);
    ir.AstNode Update1(es2panda_Context ctx, ir.AstNode original, i64 value);
    ir.AstNode Update2(es2panda_Context ctx, ir.AstNode original, f64 value);
    ir.AstNode Update3(es2panda_Context ctx, ir.AstNode original, f32 value);

    boolean SetInt(ir.AstNode node, i32 new_value);
    boolean SetLong(ir.AstNode node, i64 new_value);
    boolean SetDouble(ir.AstNode node, f64 new_value);
    boolean SetFloat(ir.AstNode node, f32 new_value);

    [get] String StrConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface Typed {

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class] interface TypedAstNode: AstNode {
};

[Entity=Class] interface AnnotatedAstNode: AstNode {
};

[Entity=Class, c_type=es2panda_AstNode] interface TypedStatement: Statement {

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class] interface AnnotatedStatement: Statement {
};

[Entity=Class, c_type=es2panda_AstNode] interface AnnotationAllowed {

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=44, c_type=es2panda_AstNode] interface LabelledStatement: Statement {

    /* explicit LabelledStatement(Identifier *ident, Statement *body) */
    static ir.LabelledStatement Create(es2panda_Context context, ir.Identifier ident, ir.Statement body);
    static ir.LabelledStatement Update(es2panda_Context context, ir.LabelledStatement original, ir.Identifier ident, ir.Statement body);

    /* Statement *Body() */
    [get] ir.Statement Body(es2panda_Context context);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* const Identifier *Ident() const */
    [get] ir.Identifier IdentConst(es2panda_Context context);

    /* Identifier *Ident() */
    [get] ir.Identifier Ident(es2panda_Context context);

    /* const ir::AstNode *GetReferencedStatement() const */
    ir.AstNode GetReferencedStatementConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=150, c_type=es2panda_AstNode] interface ThrowStatement: Statement {

    /* explicit ThrowStatement(Expression *argument) */
    static ir.ThrowStatement Create(es2panda_Context context, ir.Expression argument);
    static ir.ThrowStatement Update(es2panda_Context context, ir.ThrowStatement original, ir.Expression argument);

    /* const Expression *Argument() const */
    [get] ir.Expression ArgumentConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=17, c_type=es2panda_AstNode] interface ClassProperty: ClassElement {

    /* explicit ClassProperty(Expression *const key, Expression *const value, TypeNode *const typeAnnotation,
                           ModifierFlags const modifiers, ArenaAllocator *const allocator, bool const isComputed) */
    static ir.ClassProperty Create(es2panda_Context context, ir.Expression key, ir.Expression value, ir.TypeNode typeAnnotation, Es2pandaModifierFlags modifiers, boolean isComputed);
    static ir.ClassProperty Update(es2panda_Context context, ir.ClassProperty original, ir.Expression key, ir.Expression value, ir.TypeNode typeAnnotation, Es2pandaModifierFlags modifiers, boolean isComputed);

    /* [[nodiscard]] bool IsDefaultAccessModifier() const noexcept */
    [get] boolean IsDefaultAccessModifierConst(es2panda_Context context);

    /* void SetDefaultAccessModifier(bool isDefault) */
    [set] void SetDefaultAccessModifier(es2panda_Context context, boolean isDefault);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTypeAnnotation(TypeNode *typeAnnotation) */
    [set] void SetTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);

    /* [[nodiscard]] varbinder::Variable *BasePropertyVar() const noexcept */
    [get] varbinder.Variable BasePropertyVarConst(es2panda_Context context);

    /* void SetBasePropertyVar(varbinder::Variable *baseProperty) */
    [set] void SetBasePropertyVar(es2panda_Context context, varbinder.Variable baseProperty);

    /* void ForceDump(ir::SrcDumper *dumper) const */
    void ForceDumpConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] bool NeedInitInStaticBlock() const */
    [get] boolean NeedInitInStaticBlockConst(es2panda_Context context);

    /* void SetNeedInitInStaticBlock() */
    [set] void SetNeedInitInStaticBlock(es2panda_Context context);

    /* [[nodiscard]] bool IsImmediateInit() const */
    [get] boolean IsImmediateInitConst(es2panda_Context context);

    /* void SetIsImmediateInit() */
    [set] void SetIsImmediateInit(es2panda_Context context);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=98, c_type=es2panda_AstNode] interface TSVoidKeyword: TypeNode {

    /* explicit TSVoidKeyword(ArenaAllocator *const allocator) */
    static ir.TSVoidKeyword Create(es2panda_Context context);
    static ir.TSVoidKeyword Update(es2panda_Context context, ir.TSVoidKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=69, c_type=es2panda_AstNode] interface ETSFunctionType: TypeNode {

    /* explicit ETSFunctionType(FunctionSignature &&signature, ir::ScriptFunctionFlags const funcFlags,
                             ArenaAllocator *const allocator) noexcept */
    static ir.ETSFunctionType Create(es2panda_Context context, ir.FunctionSignature signature, Es2pandaScriptFunctionFlags funcFlags);
    static ir.ETSFunctionType Update(es2panda_Context context, ir.ETSFunctionType original, ir.FunctionSignature signature, Es2pandaScriptFunctionFlags funcFlags);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* const TSTypeParameterDeclaration *TypeParams() const */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* void SetTypeParams(TSTypeParameterDeclaration *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* const ArenaVector<ir::Expression *> &Params() const */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* void SetParams(ArenaVector<Expression *> &&paramsList) */
    [set] void SetParams(es2panda_Context context, sequence<ir.Expression> paramsList, u32 paramsListLen);

    /* const TypeNode *ReturnType() const */
    [get] ir.TypeNode ReturnTypeConst(es2panda_Context context);

    /* TypeNode *ReturnType() */
    [get] ir.TypeNode ReturnType(es2panda_Context context);

    /* void SetReturnType(TypeNode *returnType) */
    [set] void SetReturnType(es2panda_Context context, ir.TypeNode returnType);

    /* ir::TSInterfaceDeclaration *FunctionalInterface() */
    [get] ir.TSInterfaceDeclaration FunctionalInterface(es2panda_Context context);

    /* const ir::TSInterfaceDeclaration *FunctionalInterface() const */
    [get] ir.TSInterfaceDeclaration FunctionalInterfaceConst(es2panda_Context context);

    /* void SetFunctionalInterface(ir::TSInterfaceDeclaration *functionalInterface) */
    [set] void SetFunctionalInterface(es2panda_Context context, ir.TSInterfaceDeclaration functionalInterface);

    /* ir::ScriptFunctionFlags Flags() */
    [get] Es2pandaScriptFunctionFlags Flags(es2panda_Context context);

    /* ir::ScriptFunctionFlags Flags() const */
    [get] Es2pandaScriptFunctionFlags FlagsConst(es2panda_Context context);

    /* bool IsExtensionFunction() const */
    [get] boolean IsExtensionFunctionConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=121, c_type=es2panda_AstNode] interface TSTypeOperator: TypeNode {

    /* explicit TSTypeOperator(TypeNode *type, TSOperatorType operatorType, ArenaAllocator *const allocator) */
    static ir.TSTypeOperator Create(es2panda_Context context, ir.TypeNode type, Es2pandaTSOperatorType operatorType);
    static ir.TSTypeOperator Update(es2panda_Context context, ir.TSTypeOperator original, ir.TypeNode type, Es2pandaTSOperatorType operatorType);

    /* const TypeNode *Type() const */
    [get] ir.TypeNode TypeConst(es2panda_Context context);

    /* bool IsReadonly() const */
    [get] boolean IsReadonlyConst(es2panda_Context context);

    /* bool IsKeyof() const */
    [get] boolean IsKeyofConst(es2panda_Context context);

    /* bool IsUnique() const */
    [get] boolean IsUniqueConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=38, c_type=es2panda_AstNode] interface IfStatement: Statement {

    /* explicit IfStatement(Expression *test, Statement *consequent, Statement *alternate) */
    static ir.IfStatement Create(es2panda_Context context, ir.Expression test, ir.Statement consequent, ir.Statement alternate);
    static ir.IfStatement Update(es2panda_Context context, ir.IfStatement original, ir.Expression test, ir.Statement consequent, ir.Statement alternate);

    /* [[nodiscard]] const Expression *Test() const noexcept */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Test() noexcept */
    [get] ir.Expression Test(es2panda_Context context);

    /* void SetTest(Expression *test) */
    [set] void SetTest(es2panda_Context context, ir.Expression test);

    /* [[nodiscard]] const Statement *Consequent() const noexcept */
    [get] ir.Statement ConsequentConst(es2panda_Context context);

    /* [[nodiscard]] Statement *Consequent() noexcept */
    [get] ir.Statement Consequent(es2panda_Context context);

    /* void SetConsequent(Statement *consequent) noexcept */
    [set] void SetConsequent(es2panda_Context context, ir.Statement consequent);

    /* [[nodiscard]] Statement *Alternate() noexcept */
    [get] ir.Statement Alternate(es2panda_Context context);

    /* [[nodiscard]] const Statement *Alternate() const noexcept */
    [get] ir.Statement AlternateConst(es2panda_Context context);

    /* void SetAlternate(Statement *alternate) noexcept */
    [set] void SetAlternate(es2panda_Context context, ir.Statement alternate);
};

[Entity=Class, Es2pandaAstNodeType=130, c_type=es2panda_AstNode] interface TSConstructorType: TypeNode {

    /* explicit TSConstructorType(FunctionSignature signature, bool abstract, ArenaAllocator *const allocator) */
    static ir.TSConstructorType Create(es2panda_Context context, ir.FunctionSignature signature, boolean abstract);
    static ir.TSConstructorType Update(es2panda_Context context, ir.TSConstructorType original, ir.FunctionSignature signature, boolean abstract);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* const TSTypeParameterDeclaration *TypeParams() const */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* const ArenaVector<ir::Expression *> &Params() const */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* const TypeNode *ReturnType() const */
    [get] ir.TypeNode ReturnTypeConst(es2panda_Context context);

    /* TypeNode *ReturnType() */
    [get] ir.TypeNode ReturnType(es2panda_Context context);

    /* bool Abstract() const */
    [get] boolean AbstractConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=22, c_type=es2panda_AstNode] interface Decorator: Statement {

    /* explicit Decorator(Expression *expr) */
    static ir.Decorator Create(es2panda_Context context, ir.Expression expr);
    static ir.Decorator Update(es2panda_Context context, ir.Decorator original, ir.Expression expr);

    /* [[nodiscard]] const Expression *Expr() const noexcept */
    [get] ir.Expression ExprConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=91, c_type=es2panda_AstNode] interface TSEnumDeclaration: TypedStatement {

    /* explicit TSEnumDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *key,
                               ArenaVector<AstNode *> &&members, ConstructorFlags &&flags, Language lang) */
    static ir.TSEnumDeclaration Create(es2panda_Context context, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare);
    static ir.TSEnumDeclaration Update(es2panda_Context context, ir.TSEnumDeclaration original, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare);

    /* explicit TSEnumDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *key,
                               ArenaVector<AstNode *> &&members, ConstructorFlags &&flags, ir::TypeNode *typeNode,
                               Language lang) */
    static ir.TSEnumDeclaration Create1(es2panda_Context context, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, ir.TypeNode typeNode);
    static ir.TSEnumDeclaration Update1(es2panda_Context context, ir.TSEnumDeclaration original, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, ir.TypeNode typeNode);

    /* explicit TSEnumDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *key,
                               ArenaVector<AstNode *> &&members, ConstructorFlags &&flags, Language lang) */
    static ir.TSEnumDeclaration Create2(es2panda_Context context, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, Es2pandaLanguage lang);
    static ir.TSEnumDeclaration Update2(es2panda_Context context, ir.TSEnumDeclaration original, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, Es2pandaLanguage lang);

    /* explicit TSEnumDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *key,
                               ArenaVector<AstNode *> &&members, ConstructorFlags &&flags, ir::TypeNode *typeNode,
                               Language lang) */
    static ir.TSEnumDeclaration Create3(es2panda_Context context, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, ir.TypeNode typeNode, Es2pandaLanguage lang);
    static ir.TSEnumDeclaration Update3(es2panda_Context context, ir.TSEnumDeclaration original, ir.Identifier key, sequence<ir.AstNode> members, u32 membersLen, boolean isConst, boolean isStatic, boolean isDeclare, ir.TypeNode typeNode, Es2pandaLanguage lang);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* const Identifier *Key() const */
    [get] ir.Identifier KeyConst(es2panda_Context context);

    /* Identifier *Key() */
    [get] ir.Identifier Key(es2panda_Context context);

    /* const ArenaVector<AstNode *> &Members() const */
    [get] sequence<ir.AstNode> MembersConst(es2panda_Context context);

    /* const util::StringView &InternalName() const */
    [get] String InternalNameConst(es2panda_Context context);

    /* void SetInternalName(util::StringView internalName) */
    [set] void SetInternalName(es2panda_Context context, String internalName);

    /* ir::ClassDefinition *BoxedClass() const */
    [get] ir.ClassDefinition BoxedClassConst(es2panda_Context context);

    /* void SetBoxedClass(ir::ClassDefinition *boxedClass) */
    [set] void SetBoxedClass(es2panda_Context context, ir.ClassDefinition boxedClass);

    /* bool IsConst() const */
    [get] boolean IsConstConst(es2panda_Context context);

    /* [[nodiscard]] es2panda::Language Language() const noexcept */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() noexcept */
    [get] ir.TypeNode TypeAnnotation(es2panda_Context context);

    /* [[nodiscard]] const TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void EmplaceMembers(AstNode *source) */
    void EmplaceMembers(es2panda_Context context, ir.AstNode source);

    /* void ClearMembers() */
    void ClearMembers(es2panda_Context context);

    /* void SetValueMembers(AstNode *source, size_t index) */
    [set] void SetValueMembers(es2panda_Context context, ir.AstNode source, u32 index);

    /* [[nodiscard]] ArenaVector<AstNode *> &MembersForUpdate() */
    sequence<ir.AstNode> MembersForUpdate(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=103, c_type=es2panda_AstNode] interface TSNeverKeyword: TypeNode {

    /* explicit TSNeverKeyword(ArenaAllocator *const allocator) */
    static ir.TSNeverKeyword Create(es2panda_Context context);
    static ir.TSNeverKeyword Update(es2panda_Context context, ir.TSNeverKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=41, c_type=es2panda_AstNode] interface ImportDefaultSpecifier: Statement {

    /* explicit ImportDefaultSpecifier(Identifier *local) */
    static ir.ImportDefaultSpecifier Create(es2panda_Context context, ir.Identifier local);
    static ir.ImportDefaultSpecifier Update(es2panda_Context context, ir.ImportDefaultSpecifier original, ir.Identifier local);

    /* const Identifier *Local() const */
    [get] ir.Identifier LocalConst(es2panda_Context context);

    /* Identifier *Local() */
    [get] ir.Identifier Local(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=165, c_type=es2panda_AstNode] interface ObjectExpression: AnnotatedExpression {

    /* explicit ObjectExpression(AstNodeType nodeType, [[maybe_unused]] ArenaAllocator *allocator,
                              ArenaVector<Expression *> &&properties, bool trailingComma) */
    static ir.ObjectExpression Create(es2panda_Context context, Es2pandaAstNodeType nodeType, sequence<ir.Expression> properties, u32 propertiesLen, boolean trailingComma);
    static ir.ObjectExpression Update(es2panda_Context context, ir.ObjectExpression original, Es2pandaAstNodeType nodeType, sequence<ir.Expression> properties, u32 propertiesLen, boolean trailingComma);

    /* [[nodiscard]] const ArenaVector<Expression *> &Properties() const noexcept */
    [get] sequence<ir.Expression> PropertiesConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Expression *> &Properties() noexcept */
    [get] sequence<ir.Expression> Properties(es2panda_Context context);

    /* void SetProperties(ArenaVector<Expression *> &&propertiesList) */
    [set] void SetProperties(es2panda_Context context, sequence<ir.Expression> propertiesList, u32 propertiesListLen);

    /* [[nodiscard]] bool IsDeclaration() const noexcept */
    [get] boolean IsDeclarationConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* [[nodiscard]] bool HasMethodDefinition() const noexcept */
    boolean HasMethodDefinitionConst(es2panda_Context context);

    /* [[nodiscard]] bool ConvertibleToObjectPattern() */
    boolean ConvertibleToObjectPattern(es2panda_Context context);

    /* void SetDeclaration() */
    [set] void SetDeclaration(es2panda_Context context);

    /* void SetOptional(bool optional) */
    [set] void SetOptional(es2panda_Context context, boolean optional_arg);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=43, c_type=es2panda_AstNode] interface ImportSpecifier: Statement {

    /* explicit ImportSpecifier(Identifier *imported, Identifier *local) */
    static ir.ImportSpecifier Create(es2panda_Context context, ir.Identifier imported, ir.Identifier local);
    static ir.ImportSpecifier Update(es2panda_Context context, ir.ImportSpecifier original, ir.Identifier imported, ir.Identifier local);

    /* Identifier *Imported() */
    [get] ir.Identifier Imported(es2panda_Context context);

    /* const Identifier *Imported() const */
    [get] ir.Identifier ImportedConst(es2panda_Context context);

    /* Identifier *Local() */
    [get] ir.Identifier Local(es2panda_Context context);

    /* const Identifier *Local() const */
    [get] ir.Identifier LocalConst(es2panda_Context context);

    /* bool IsRemovable() const */
    [get] boolean IsRemovableConst(es2panda_Context context);

    /* void SetRemovable(bool isRemovable) */
    [set] void SetRemovable(es2panda_Context context, boolean isRemovable);
};

[Entity=Class, Es2pandaAstNodeType=19, c_type=es2panda_AstNode] interface ConditionalExpression: Expression {

    /* explicit ConditionalExpression(Expression *test, Expression *consequent, Expression *alternate) */
    static ir.ConditionalExpression Create(es2panda_Context context, ir.Expression test, ir.Expression consequent, ir.Expression alternate);
    static ir.ConditionalExpression Update(es2panda_Context context, ir.ConditionalExpression original, ir.Expression test, ir.Expression consequent, ir.Expression alternate);

    /* [[nodiscard]] const Expression *Test() const noexcept */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Test() noexcept */
    [get] ir.Expression Test(es2panda_Context context);

    /* void SetTest(Expression *expr) noexcept */
    [set] void SetTest(es2panda_Context context, ir.Expression expr);

    /* [[nodiscard]] const Expression *Consequent() const noexcept */
    [get] ir.Expression ConsequentConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Consequent() noexcept */
    [get] ir.Expression Consequent(es2panda_Context context);

    /* void SetConsequent(Expression *expr) noexcept */
    [set] void SetConsequent(es2panda_Context context, ir.Expression expr);

    /* [[nodiscard]] const Expression *Alternate() const noexcept */
    [get] ir.Expression AlternateConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Alternate() noexcept */
    [get] ir.Expression Alternate(es2panda_Context context);

    /* void SetAlternate(Expression *expr) noexcept */
    [set] void SetAlternate(es2panda_Context context, ir.Expression expr);
};

[Entity=Class, Es2pandaAstNodeType=10, c_type=es2panda_AstNode] interface CallExpression: MaybeOptionalExpression {

    /* explicit CallExpression(Expression *const callee, ArenaVector<Expression *> &&arguments,
                            TSTypeParameterInstantiation *const typeParams, bool const optional,
                            bool const trailingComma = false) */
    static ir.CallExpression Create(es2panda_Context context, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen, ir.TSTypeParameterInstantiation typeParams, boolean optional_arg, boolean trailingComma);
    static ir.CallExpression Update(es2panda_Context context, ir.CallExpression original, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen, ir.TSTypeParameterInstantiation typeParams, boolean optional_arg, boolean trailingComma);

    /* explicit CallExpression(CallExpression const &other, ArenaAllocator *allocator) */
    static ir.CallExpression Create1(es2panda_Context context, ir.CallExpression other);
    static ir.CallExpression Update1(es2panda_Context context, ir.CallExpression original, ir.CallExpression other);

    /* const Expression *Callee() const */
    [get] ir.Expression CalleeConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Callee() noexcept */
    [get] ir.Expression Callee(es2panda_Context context);

    /* void SetCallee(Expression *callee) noexcept */
    [set] void SetCallee(es2panda_Context context, ir.Expression callee);

    /* [[nodiscard]] const TSTypeParameterInstantiation *TypeParams() const noexcept */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] TSTypeParameterInstantiation *TypeParams() noexcept */
    [get] ir.TSTypeParameterInstantiation TypeParams(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Expression *> &Arguments() const noexcept */
    [get] sequence<ir.Expression> ArgumentsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Expression *> &Arguments() noexcept */
    [get] sequence<ir.Expression> Arguments(es2panda_Context context);

    /* void SetArguments(ArenaVector<Expression *> &&argumentsList) */
    [set] void SetArguments(es2panda_Context context, sequence<ir.Expression> argumentsList, u32 argumentsListLen);

    /* [[nodiscard]] bool HasTrailingComma() const noexcept */
    [get] boolean HasTrailingCommaConst(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() noexcept */
    [get] checker.Signature Signature(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() const noexcept */
    [get] checker.Signature SignatureConst(es2panda_Context context);

    /* void SetSignature(checker::Signature *const signature) noexcept */
    [set] void SetSignature(es2panda_Context context, checker.Signature signature);

    /* void SetTypeParams(TSTypeParameterInstantiation *typeParams) noexcept */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterInstantiation typeParams);

    /* [[nodiscard]] checker::Type *UncheckedType() const noexcept */
    [get] checker.Type UncheckedTypeConst(es2panda_Context context);

    /* void SetUncheckedType(checker::Type *type) noexcept */
    [set] void SetUncheckedType(es2panda_Context context, checker.Type type);

    /* void SetTrailingBlock(ir::BlockStatement *const block) noexcept */
    [set] void SetTrailingBlock(es2panda_Context context, ir.BlockStatement block);

    /* bool IsExtensionAccessorCall() */
    boolean IsExtensionAccessorCall(es2panda_Context context);

    /* [[nodiscard]] ir::BlockStatement *TrailingBlock() const noexcept */
    [get] ir.BlockStatement TrailingBlockConst(es2panda_Context context);

    /* void SetIsTrailingBlockInNewLine(bool const isNewLine) noexcept */
    [set] void SetIsTrailingBlockInNewLine(es2panda_Context context, boolean isNewLine);

    /* [[nodiscard]] bool IsTrailingBlockInNewLine() const noexcept */
    [get] boolean IsTrailingBlockInNewLineConst(es2panda_Context context);

    /* void SetIsTrailingCall(bool const isTrailingCall) noexcept */
    [set] void SetIsTrailingCall(es2panda_Context context, boolean isTrailingCall);

    /* [[nodiscard]] bool IsTrailingCall() const noexcept */
    [get] boolean IsTrailingCallConst(es2panda_Context context);

    /* bool IsETSConstructorCall() const noexcept */
    [get] boolean IsETSConstructorCallConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=5, c_type=es2panda_AstNode] interface BigIntLiteral: Literal {

    /* explicit BigIntLiteral(util::StringView const src) */
    static ir.BigIntLiteral Create(es2panda_Context context, String src);
    static ir.BigIntLiteral Update(es2panda_Context context, ir.BigIntLiteral original, String src);

    /* const util::StringView &Str() const noexcept */
    [get] String StrConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface ClassElement: TypedStatement {

    /* [[nodiscard]] Identifier *Id() noexcept */
    ir.Identifier Id(es2panda_Context context);

    /* [[nodiscard]] const Identifier *Id() const noexcept */
    ir.Identifier IdConst(es2panda_Context context);

    /* void SetId(Identifier *id) */
    [set] void SetId(es2panda_Context context, ir.Identifier id);

    /* [[nodiscard]] Expression *Key() noexcept */
    [get] ir.Expression Key(es2panda_Context context);

    /* [[nodiscard]] const Expression *Key() const noexcept */
    [get] ir.Expression KeyConst(es2panda_Context context);

    /* void SetKey(Expression *key) */
    [set] void SetKey(es2panda_Context context, ir.Expression key);

    /* [[nodiscard]] Expression *Value() noexcept */
    [get] ir.Expression Value(es2panda_Context context);

    /* void SetValue(Expression *value) noexcept */
    [set] void SetValue(es2panda_Context context, ir.Expression value);

    /* [[nodiscard]] const Expression *Value() const noexcept */
    [get] ir.Expression ValueConst(es2panda_Context context);

    /* [[nodiscard]] const TSEnumMember *OriginEnumMember() const noexcept */
    [get] ir.TSEnumMember OriginEnumMemberConst(es2panda_Context context);

    /* void SetOrigEnumMember(ir::TSEnumMember *enumMember) */
    [set] void SetOrigEnumMember(es2panda_Context context, ir.TSEnumMember enumMember);

    /* [[nodiscard]] bool IsPrivateElement() const noexcept */
    boolean IsPrivateElementConst(es2panda_Context context);

    /* [[nodiscard]] bool IsComputed() const noexcept */
    [get] boolean IsComputedConst(es2panda_Context context);

    /* [[nodiscard]] virtual PrivateFieldKind ToPrivateFieldKind(bool isStatic) const = 0 */
    Es2pandaPrivateFieldKind ToPrivateFieldKindConst(es2panda_Context context, boolean isStatic);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=116, c_type=es2panda_AstNode] interface TSImportType: TypeNode {

    /* explicit TSImportType(Expression *param, TSTypeParameterInstantiation *typeParams, Expression *qualifier,
                          bool isTypeof, ArenaAllocator *const allocator) */
    static ir.TSImportType Create(es2panda_Context context, ir.Expression param, ir.TSTypeParameterInstantiation typeParams, ir.Expression qualifier, boolean isTypeof);
    static ir.TSImportType Update(es2panda_Context context, ir.TSImportType original, ir.Expression param, ir.TSTypeParameterInstantiation typeParams, ir.Expression qualifier, boolean isTypeof);

    /* const Expression *Param() const */
    [get] ir.Expression ParamConst(es2panda_Context context);

    /* const TSTypeParameterInstantiation *TypeParams() const */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);

    /* const Expression *Qualifier() const */
    [get] ir.Expression QualifierConst(es2panda_Context context);

    /* bool IsTypeof() const */
    [get] boolean IsTypeofConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=145, c_type=es2panda_AstNode] interface TaggedTemplateExpression: Expression {

    /* explicit TaggedTemplateExpression(Expression *tag, TemplateLiteral *quasi, TSTypeParameterInstantiation *typeParams) */
    static ir.TaggedTemplateExpression Create(es2panda_Context context, ir.Expression tag, ir.TemplateLiteral quasi, ir.TSTypeParameterInstantiation typeParams);
    static ir.TaggedTemplateExpression Update(es2panda_Context context, ir.TaggedTemplateExpression original, ir.Expression tag, ir.TemplateLiteral quasi, ir.TSTypeParameterInstantiation typeParams);

    /* [[nodiscard]] const Expression *Tag() const noexcept */
    [get] ir.Expression TagConst(es2panda_Context context);

    /* [[nodiscard]] const TemplateLiteral *Quasi() const noexcept */
    [get] ir.TemplateLiteral QuasiConst(es2panda_Context context);

    /* [[nodiscard]] const TSTypeParameterInstantiation *TypeParams() const noexcept */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=34, c_type=es2panda_AstNode] interface FunctionDeclaration: Statement {

    /* explicit FunctionDeclaration([[maybe_unused]] ArenaAllocator *allocator, ScriptFunction *func,
                                 ArenaVector<AnnotationUsage *> &&annotations, bool isAnonymous = false) */
    static ir.FunctionDeclaration Create(es2panda_Context context, ir.ScriptFunction func, sequence<ir.AnnotationUsage> annotations, u32 annotationsLen, boolean isAnonymous);
    static ir.FunctionDeclaration Update(es2panda_Context context, ir.FunctionDeclaration original, ir.ScriptFunction func, sequence<ir.AnnotationUsage> annotations, u32 annotationsLen, boolean isAnonymous);

    /* explicit FunctionDeclaration([[maybe_unused]] ArenaAllocator *allocator, ScriptFunction *func,
                                 bool isAnonymous = false) */
    static ir.FunctionDeclaration Create1(es2panda_Context context, ir.ScriptFunction func, boolean isAnonymous);
    static ir.FunctionDeclaration Update1(es2panda_Context context, ir.FunctionDeclaration original, ir.ScriptFunction func, boolean isAnonymous);

    /* ScriptFunction *Function() */
    [get] ir.ScriptFunction Function(es2panda_Context context);

    /* void SetFunction(ScriptFunction *func) */
    [set] void SetFunction(es2panda_Context context, ir.ScriptFunction func);

    /* bool IsAnonymous() const */
    [get] boolean IsAnonymousConst(es2panda_Context context);

    /* const ScriptFunction *Function() const */
    [get] ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=75, c_type=es2panda_AstNode] interface ETSTypeReference: TypeNode {

    /* explicit ETSTypeReference(ir::ETSTypeReferencePart *part, ArenaAllocator *const allocator) */
    static ir.ETSTypeReference Create(es2panda_Context context, ir.ETSTypeReferencePart part);
    static ir.ETSTypeReference Update(es2panda_Context context, ir.ETSTypeReference original, ir.ETSTypeReferencePart part);

    /* ir::ETSTypeReferencePart *Part() */
    [get] ir.ETSTypeReferencePart Part(es2panda_Context context);

    /* ir::ETSTypeReferencePart *Part() const */
    [get] ir.ETSTypeReferencePart PartConst(es2panda_Context context);

    /* void SetPart(ETSTypeReferencePart *part) */
    [set] void SetPart(es2panda_Context context, ir.ETSTypeReferencePart part);

    /* ir::Identifier *BaseName() const */
    ir.Identifier BaseNameConst(es2panda_Context context);

    /* checker::Type *HandleTypeRefAnnotations(checker::ETSChecker *checker, checker::Type *originalType) */
    checker.Type HandleTypeRefAnnotations(es2panda_Context context, checker.Type originalType);
};

[Entity=Class, Es2pandaAstNodeType=132, c_type=es2panda_AstNode] interface TSTypeReference: TypeNode {

    /* explicit TSTypeReference(Expression *typeName, TSTypeParameterInstantiation *typeParams,
                             ArenaAllocator *const allocator) */
    static ir.TSTypeReference Create(es2panda_Context context, ir.Expression typeName, ir.TSTypeParameterInstantiation typeParams);
    static ir.TSTypeReference Update(es2panda_Context context, ir.TSTypeReference original, ir.Expression typeName, ir.TSTypeParameterInstantiation typeParams);

    /* const TSTypeParameterInstantiation *TypeParams() const */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);

    /* const Expression *TypeName() const */
    [get] ir.Expression TypeNameConst(es2panda_Context context);

    /* ir::Identifier *BaseName() const */
    ir.Identifier BaseNameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=48, c_type=es2panda_AstNode] interface NamedType: TypeNode {

    /* explicit NamedType(Identifier *name, ArenaAllocator *const allocator) */
    static ir.NamedType Create(es2panda_Context context, ir.Identifier name);
    static ir.NamedType Update(es2panda_Context context, ir.NamedType original, ir.Identifier name);

    /* const Identifier *Name() const */
    [get] ir.Identifier NameConst(es2panda_Context context);

    /* const TSTypeParameterInstantiation *TypeParams() const */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);

    /* bool IsNullable() const */
    [get] boolean IsNullableConst(es2panda_Context context);

    /* void SetNullable(bool nullable) */
    [set] void SetNullable(es2panda_Context context, boolean nullable);

    /* void SetNext(NamedType *next) */
    [set] void SetNext(es2panda_Context context, ir.NamedType next);

    /* void SetTypeParams(TSTypeParameterInstantiation *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterInstantiation typeParams);
};

[Entity=Class, Es2pandaAstNodeType=129, c_type=es2panda_AstNode] interface TSFunctionType: TypeNode {

    /* explicit TSFunctionType(FunctionSignature &&signature, ArenaAllocator *const allocator) */
    static ir.TSFunctionType Create(es2panda_Context context, ir.FunctionSignature signature);
    static ir.TSFunctionType Update(es2panda_Context context, ir.TSFunctionType original, ir.FunctionSignature signature);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* const TSTypeParameterDeclaration *TypeParams() const */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* const ArenaVector<ir::Expression *> &Params() const */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* const TypeNode *ReturnType() const */
    [get] ir.TypeNode ReturnTypeConst(es2panda_Context context);

    /* TypeNode *ReturnType() */
    [get] ir.TypeNode ReturnType(es2panda_Context context);

    /* void SetNullable(bool nullable) */
    [set] void SetNullable(es2panda_Context context, boolean nullable);
};

[Entity=Class, Es2pandaAstNodeType=146, c_type=es2panda_AstNode] interface TemplateElement: Expression {

    /* explicit TemplateElement() */
    static ir.TemplateElement Create(es2panda_Context context);
    static ir.TemplateElement Update(es2panda_Context context, ir.TemplateElement original);

    /* explicit TemplateElement(util::StringView const raw, util::StringView const cooked) */
    static ir.TemplateElement Create1(es2panda_Context context, String raw, String cooked);
    static ir.TemplateElement Update1(es2panda_Context context, ir.TemplateElement original, String raw, String cooked);

    /* [[nodiscard]] const util::StringView &Raw() const noexcept */
    [get] String RawConst(es2panda_Context context);

    /* [[nodiscard]] const util::StringView &Cooked() const noexcept */
    [get] String CookedConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=135, c_type=es2panda_AstNode] interface TSInterfaceDeclaration: TypedStatement {

    /* explicit TSInterfaceDeclaration([[maybe_unused]] ArenaAllocator *allocator,
                                    ArenaVector<TSInterfaceHeritage *> &&extends, ConstructorData &&data) */
    static ir.TSInterfaceDeclaration Create(es2panda_Context context, sequence<ir.TSInterfaceHeritage> extends, u32 extendsLen, ir.AstNode id, ir.AstNode typeParams, ir.AstNode body, boolean isStatic, boolean isExternal);
    static ir.TSInterfaceDeclaration Update(es2panda_Context context, ir.TSInterfaceDeclaration original, sequence<ir.TSInterfaceHeritage> extends, u32 extendsLen, ir.AstNode id, ir.AstNode typeParams, ir.AstNode body, boolean isStatic, boolean isExternal);

    /* explicit TSInterfaceDeclaration([[maybe_unused]] ArenaAllocator *allocator,
                                    ArenaVector<TSInterfaceHeritage *> &&extends, ConstructorData &&data) */
    static ir.TSInterfaceDeclaration Create1(es2panda_Context context, sequence<ir.TSInterfaceHeritage> extends, u32 extendsLen, ir.AstNode id, ir.AstNode typeParams, ir.AstNode body, boolean isStatic, boolean isExternal, Es2pandaLanguage language);
    static ir.TSInterfaceDeclaration Update1(es2panda_Context context, ir.TSInterfaceDeclaration original, sequence<ir.TSInterfaceHeritage> extends, u32 extendsLen, ir.AstNode id, ir.AstNode typeParams, ir.AstNode body, boolean isStatic, boolean isExternal, Es2pandaLanguage language);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* TSInterfaceBody *Body() */
    [get] ir.TSInterfaceBody Body(es2panda_Context context);

    /* const TSInterfaceBody *Body() const */
    [get] ir.TSInterfaceBody BodyConst(es2panda_Context context);

    /* void SetBody(TSInterfaceBody *body) */
    [set] void SetBody(es2panda_Context context, ir.TSInterfaceBody body);

    /* Identifier *Id() */
    [get] ir.Identifier Id(es2panda_Context context);

    /* const Identifier *Id() const */
    [get] ir.Identifier IdConst(es2panda_Context context);

    /* void SetId(Identifier *id) */
    [set] void SetId(es2panda_Context context, ir.Identifier id);

    /* const util::StringView &InternalName() const */
    [get] String InternalNameConst(es2panda_Context context);

    /* void SetInternalName(util::StringView internalName) */
    [set] void SetInternalName(es2panda_Context context, String internalName);

    /* bool IsStatic() const */
    [get] boolean IsStaticConst(es2panda_Context context);

    /* bool IsFromExternal() const */
    [get] boolean IsFromExternalConst(es2panda_Context context);

    /* const TSTypeParameterDeclaration *TypeParams() const */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* void SetTypeParams(TSTypeParameterDeclaration *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* [[nodiscard]] const ArenaVector<TSInterfaceHeritage *> &Extends() */
    sequence<ir.TSInterfaceHeritage> Extends(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<TSInterfaceHeritage *> &ExtendsForUpdate() */
    sequence<ir.TSInterfaceHeritage> ExtendsForUpdate(es2panda_Context context);

    /* const ArenaVector<TSInterfaceHeritage *> &Extends() const */
    [get] sequence<ir.TSInterfaceHeritage> ExtendsConst(es2panda_Context context);

    /* [[nodiscard]] es2panda::Language Language() const noexcept */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* ClassDeclaration *GetAnonClass() noexcept */
    [get] ir.ClassDeclaration GetAnonClass(es2panda_Context context);

    /* ClassDeclaration *GetAnonClass() const noexcept */
    [get] ir.ClassDeclaration GetAnonClassConst(es2panda_Context context);

    /* void SetAnonClass(ClassDeclaration *anonClass) */
    [set] void SetAnonClass(es2panda_Context context, ir.ClassDeclaration anonClass);

    /* void EmplaceExtends(TSInterfaceHeritage *extends) */
    void EmplaceExtends(es2panda_Context context, ir.TSInterfaceHeritage extends);

    /* void ClearExtends() */
    void ClearExtends(es2panda_Context context);

    /* void SetValueExtends(TSInterfaceHeritage *extends, size_t index) */
    [set] void SetValueExtends(es2panda_Context context, ir.TSInterfaceHeritage extends, u32 index);

    /* void SetExtends(ArenaVector<TSInterfaceHeritage *> &&extendsList) */
    [set] void SetExtends(es2panda_Context context, sequence<ir.TSInterfaceHeritage> extendsList, u32 extendsListLen);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=154, c_type=es2panda_AstNode] interface VariableDeclaration: Statement {

    /* explicit VariableDeclaration(VariableDeclarationKind kind, ArenaAllocator *allocator,
                                 ArenaVector<VariableDeclarator *> &&declarators) */
    static ir.VariableDeclaration Create(es2panda_Context context, Es2pandaVariableDeclarationKind kind, sequence<ir.VariableDeclarator> declarators, u32 declaratorsLen);
    static ir.VariableDeclaration Update(es2panda_Context context, ir.VariableDeclaration original, Es2pandaVariableDeclarationKind kind, sequence<ir.VariableDeclarator> declarators, u32 declaratorsLen);

    /* const ArenaVector<VariableDeclarator *> &Declarators() const */
    [get] sequence<ir.VariableDeclarator> DeclaratorsConst(es2panda_Context context);

    /* void SetDeclarators(ArenaVector<VariableDeclarator *> &&declaratorsList) */
    [set] void SetDeclarators(es2panda_Context context, sequence<ir.VariableDeclarator> declaratorsList, u32 declaratorsListLen);

    /* [[nodiscard]] const ArenaVector<VariableDeclarator *> &Declarators() */
    sequence<ir.VariableDeclarator> Declarators(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<VariableDeclarator *> &DeclaratorsForUpdate() */
    sequence<ir.VariableDeclarator> DeclaratorsForUpdate(es2panda_Context context);

    /* VariableDeclarationKind Kind() const */
    [get] Es2pandaVariableDeclarationKind KindConst(es2panda_Context context);

    /* VariableDeclarator *GetDeclaratorByName(util::StringView name) const */
    ir.VariableDeclarator GetDeclaratorByNameConst(es2panda_Context context, String name);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=51, c_type=es2panda_AstNode] interface UndefinedLiteral: Literal {

    /* explicit UndefinedLiteral() */
    static ir.UndefinedLiteral Create(es2panda_Context context);
    static ir.UndefinedLiteral Update(es2panda_Context context, ir.UndefinedLiteral original);
};

[Entity=Class, Es2pandaAstNodeType=45, c_type=es2panda_AstNode] interface MemberExpression: MaybeOptionalExpression {

    /* explicit MemberExpression(Expression *object, Expression *property, MemberExpressionKind kind, bool computed,
                              bool optional) */
    static ir.MemberExpression Create(es2panda_Context context, ir.Expression object_arg, ir.Expression property, Es2pandaMemberExpressionKind kind, boolean computed, boolean optional_arg);
    static ir.MemberExpression Update(es2panda_Context context, ir.MemberExpression original, ir.Expression object_arg, ir.Expression property, Es2pandaMemberExpressionKind kind, boolean computed, boolean optional_arg);

    /* [[nodiscard]] Expression *Object() noexcept */
    [get] ir.Expression Object(es2panda_Context context);

    /* [[nodiscard]] const Expression *Object() const noexcept */
    [get] ir.Expression ObjectConst(es2panda_Context context);

    /* void SetObject(Expression *object) noexcept */
    [set] void SetObject(es2panda_Context context, ir.Expression object_arg);

    /* void SetProperty(Expression *prop) noexcept */
    [set] void SetProperty(es2panda_Context context, ir.Expression prop);

    /* [[nodiscard]] Expression *Property() noexcept */
    [get] ir.Expression Property(es2panda_Context context);

    /* [[nodiscard]] const Expression *Property() const noexcept */
    [get] ir.Expression PropertyConst(es2panda_Context context);

    /* [[nodiscard]] varbinder::LocalVariable *PropVar() noexcept */
    varbinder.LocalVariable PropVar(es2panda_Context context);

    /* [[nodiscard]] const varbinder::LocalVariable *PropVar() const noexcept */
    varbinder.LocalVariable PropVarConst(es2panda_Context context);

    /* [[nodiscard]] bool IsComputed() const noexcept */
    [get] boolean IsComputedConst(es2panda_Context context);

    /* [[nodiscard]] MemberExpressionKind Kind() const noexcept */
    [get] Es2pandaMemberExpressionKind KindConst(es2panda_Context context);

    /* void AddMemberKind(MemberExpressionKind kind) noexcept */
    [set] void AddMemberKind(es2panda_Context context, Es2pandaMemberExpressionKind kind);

    /* [[nodiscard]] bool HasMemberKind(MemberExpressionKind kind) const noexcept */
    [get] boolean HasMemberKindConst(es2panda_Context context, Es2pandaMemberExpressionKind kind);

    /* void RemoveMemberKind(MemberExpressionKind const kind) noexcept */
    void RemoveMemberKind(es2panda_Context context, Es2pandaMemberExpressionKind kind);

    /* [[nodiscard]] checker::ETSObjectType *ObjType() const noexcept */
    [get] checker.ETSObjectType ObjTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::ETSFunctionType *ExtensionAccessorType() const */
    [get] checker.ETSFunctionType ExtensionAccessorTypeConst(es2panda_Context context);

    /* void SetExtensionAccessorType(checker::ETSFunctionType *eAccessorType) */
    [set] void SetExtensionAccessorType(es2panda_Context context, checker.ETSFunctionType eAccessorType);

    /* void SetPropVar(varbinder::LocalVariable *propVar) noexcept */
    [set] void SetPropVar(es2panda_Context context, varbinder.LocalVariable propVar);

    /* void SetObjectType(checker::ETSObjectType *objType) noexcept */
    [set] void SetObjectType(es2panda_Context context, checker.ETSObjectType objType);

    /* [[nodiscard]] bool IsIgnoreBox() const noexcept */
    [get] boolean IsIgnoreBoxConst(es2panda_Context context);

    /* void SetIgnoreBox() noexcept */
    [set] void SetIgnoreBox(es2panda_Context context);

    /* [[nodiscard]] checker::Type *UncheckedType() const noexcept */
    [get] checker.Type UncheckedTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsPrivateReference() const noexcept */
    boolean IsPrivateReferenceConst(es2panda_Context context);

    /* checker::Type *GetTypeOfTupleElement(checker::ETSChecker *checker, checker::Type *baseType) */
    checker.Type GetTypeOfTupleElement(es2panda_Context context, checker.Type baseType);

    /* void CompileToReg(compiler::PandaGen *pg, compiler::VReg objReg) const */
    void CompileToRegConst(es2panda_Context context, es2panda_CodeGen pg, es2panda_VReg objReg);

    /* void CompileToRegs(compiler::PandaGen *pg, compiler::VReg object, compiler::VReg property) const */
    void CompileToRegsConst(es2panda_Context context, es2panda_CodeGen pg, es2panda_VReg object_arg, es2panda_VReg property);
};

[Entity=Class, Es2pandaAstNodeType=143, c_type=es2panda_AstNode] interface TSClassImplements: Expression {

    /* explicit TSClassImplements(Expression *expression, TSTypeParameterInstantiation *typeParameters) */
    static ir.TSClassImplements Create(es2panda_Context context, ir.Expression expression, ir.TSTypeParameterInstantiation typeParameters);
    static ir.TSClassImplements Update(es2panda_Context context, ir.TSClassImplements original, ir.Expression expression, ir.TSTypeParameterInstantiation typeParameters);

    /* explicit TSClassImplements(Expression *expression) */
    static ir.TSClassImplements Create1(es2panda_Context context, ir.Expression expression);
    static ir.TSClassImplements Update1(es2panda_Context context, ir.TSClassImplements original, ir.Expression expression);

    /* Expression *Expr() */
    [get] ir.Expression Expr(es2panda_Context context);

    /* const Expression *Expr() const */
    [get] ir.Expression ExprConst(es2panda_Context context);

    /* const TSTypeParameterInstantiation *TypeParameters() const */
    [get] ir.TSTypeParameterInstantiation TypeParametersConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=101, c_type=es2panda_AstNode] interface TSObjectKeyword: TypeNode {

    /* explicit TSObjectKeyword(ArenaAllocator *const allocator) */
    static ir.TSObjectKeyword Create(es2panda_Context context);
    static ir.TSObjectKeyword Update(es2panda_Context context, ir.TSObjectKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=78, c_type=es2panda_AstNode] interface ETSUnionType: TypeNode {

    /* explicit ETSUnionType(ArenaVector<TypeNode *> &&types, ArenaAllocator *const allocator) */
    static ir.ETSUnionType Create(es2panda_Context context, sequence<ir.TypeNode> types, u32 typesLen);
    static ir.ETSUnionType Update(es2panda_Context context, ir.ETSUnionType original, sequence<ir.TypeNode> types, u32 typesLen);

    /* const ArenaVector<TypeNode *> &Types() const */
    [get] sequence<ir.TypeNode> TypesConst(es2panda_Context context);

    /* void SetValueTypes(TypeNode *type, size_t index) const */
    [set] void SetValueTypesConst(es2panda_Context context, ir.TypeNode type, u32 index);

    /* void SetTypes(ArenaVector<TypeNode *> &&typesList) */
    [set] void SetTypes(es2panda_Context context, sequence<ir.TypeNode> typesList, u32 typesListLen);
};

[Entity=Class, Es2pandaAstNodeType=79, c_type=es2panda_AstNode] interface ETSKeyofType: TypeNode {

    /* explicit ETSKeyofType(TypeNode *type, ArenaAllocator *const allocator) */
    static ir.ETSKeyofType Create(es2panda_Context context, ir.TypeNode type);
    static ir.ETSKeyofType Update(es2panda_Context context, ir.ETSKeyofType original, ir.TypeNode type);

    /* ir::TypeNode *GetTypeRef() const */
    [get] ir.TypeNode GetTypeRefConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=109, c_type=es2panda_AstNode] interface TSPropertySignature: AnnotatedAstNode {

    /* explicit TSPropertySignature(Expression *key, TypeNode *typeAnnotation, bool computed, bool optional, bool readonly) */
    static ir.TSPropertySignature Create(es2panda_Context context, ir.Expression key, ir.TypeNode typeAnnotation, boolean computed, boolean optional_arg, boolean readonly_arg);
    static ir.TSPropertySignature Update(es2panda_Context context, ir.TSPropertySignature original, ir.Expression key, ir.TypeNode typeAnnotation, boolean computed, boolean optional_arg, boolean readonly_arg);

    /* [[nodiscard]] const Expression *Key() const noexcept */
    [get] ir.Expression KeyConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Key() noexcept */
    [get] ir.Expression Key(es2panda_Context context);

    /* [[nodiscard]] bool Computed() const noexcept */
    [get] boolean ComputedConst(es2panda_Context context);

    /* [[nodiscard]] bool Optional() const noexcept */
    [get] boolean OptionalConst(es2panda_Context context);

    /* [[nodiscard]] bool Readonly() const noexcept */
    [get] boolean ReadonlyConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=115, c_type=es2panda_AstNode] interface TSConditionalType: TypeNode {

    /* explicit TSConditionalType(Expression *checkType, Expression *extendsType, Expression *trueType,
                               Expression *falseType, ArenaAllocator *const allocator) */
    static ir.TSConditionalType Create(es2panda_Context context, ir.Expression checkType, ir.Expression extendsType, ir.Expression trueType, ir.Expression falseType);
    static ir.TSConditionalType Update(es2panda_Context context, ir.TSConditionalType original, ir.Expression checkType, ir.Expression extendsType, ir.Expression trueType, ir.Expression falseType);

    /* const Expression *CheckType() const */
    [get] ir.Expression CheckTypeConst(es2panda_Context context);

    /* const Expression *ExtendsType() const */
    [get] ir.Expression ExtendsTypeConst(es2panda_Context context);

    /* const Expression *TrueType() const */
    [get] ir.Expression TrueTypeConst(es2panda_Context context);

    /* const Expression *FalseType() const */
    [get] ir.Expression FalseTypeConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=113, c_type=es2panda_AstNode] interface TSLiteralType: TypeNode {

    /* explicit TSLiteralType(Expression *literal, ArenaAllocator *const allocator) */
    static ir.TSLiteralType Create(es2panda_Context context, ir.Expression literal);
    static ir.TSLiteralType Update(es2panda_Context context, ir.TSLiteralType original, ir.Expression literal);

    /* const Expression *Literal() const */
    [get] ir.Expression LiteralConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=131, c_type=es2panda_AstNode] interface TSTypeAliasDeclaration: AnnotatedStatement {

    /* explicit TSTypeAliasDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *id,
                                    TSTypeParameterDeclaration *typeParams, TypeNode *typeAnnotation) */
    static ir.TSTypeAliasDeclaration Create(es2panda_Context context, ir.Identifier id, ir.TSTypeParameterDeclaration typeParams, ir.TypeNode typeAnnotation);
    static ir.TSTypeAliasDeclaration Update(es2panda_Context context, ir.TSTypeAliasDeclaration original, ir.Identifier id, ir.TSTypeParameterDeclaration typeParams, ir.TypeNode typeAnnotation);

    /* explicit TSTypeAliasDeclaration([[maybe_unused]] ArenaAllocator *allocator, Identifier *id) */
    static ir.TSTypeAliasDeclaration Create1(es2panda_Context context, ir.Identifier id);
    static ir.TSTypeAliasDeclaration Update1(es2panda_Context context, ir.TSTypeAliasDeclaration original, ir.Identifier id);

    /* Identifier *Id() */
    [get] ir.Identifier Id(es2panda_Context context);

    /* const Identifier *Id() const */
    [get] ir.Identifier IdConst(es2panda_Context context);

    /* void SetId(Identifier *id) */
    [set] void SetId(es2panda_Context context, ir.Identifier id);

    /* TSTypeParameterDeclaration *TypeParams() const */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* void SetTypeParameters(ir::TSTypeParameterDeclaration *typeParams) */
    [set] void SetTypeParameters(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* void SetTypeParameterTypes(ArenaVector<checker::Type *> &&typeParamTypes) */
    [set] void SetTypeParameterTypes(es2panda_Context context, sequence<checker.Type> typeParamTypes, u32 typeParamTypesLen);

    /* ArenaVector<checker::Type *> const &TypeParameterTypes() const */
    [get] sequence<checker.Type> TypeParameterTypesConst(es2panda_Context context);

    /* void SetTypeAnnotation(TypeNode *typeAnnotation) */
    [set] void SetTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);

    /* void EmplaceTypeParamterTypes(checker::Type *typeParamTypes) */
    void EmplaceTypeParamterTypes(es2panda_Context context, checker.Type typeParamTypes);

    /* void ClearTypeParamterTypes() */
    void ClearTypeParamterTypes(es2panda_Context context);

    /* void SetValueTypeParamterTypes(checker::Type *typeParamTypes, size_t index) */
    [set] void SetValueTypeParamterTypes(es2panda_Context context, checker.Type typeParamTypes, u32 index);

    /* [[nodiscard]] ArenaVector<checker::Type *> &TypeParamterTypesForUpdate() */
    sequence<checker.Type> TypeParamterTypesForUpdate(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=21, c_type=es2panda_AstNode] interface DebuggerStatement: Statement {

    /* explicit DebuggerStatement() */
    static ir.DebuggerStatement Create(es2panda_Context context);
    static ir.DebuggerStatement Update(es2panda_Context context, ir.DebuggerStatement original);
};

[Entity=Class, Es2pandaAstNodeType=59, c_type=es2panda_AstNode] interface ReturnStatement: Statement {

    /* explicit ReturnStatement() */
    static ir.ReturnStatement Create(es2panda_Context context);
    static ir.ReturnStatement Update(es2panda_Context context, ir.ReturnStatement original);

    /* explicit ReturnStatement(Expression *argument) */
    static ir.ReturnStatement Create1(es2panda_Context context, ir.Expression argument);
    static ir.ReturnStatement Update1(es2panda_Context context, ir.ReturnStatement original, ir.Expression argument);

    /* Expression *Argument() noexcept */
    [get] ir.Expression Argument(es2panda_Context context);

    /* const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);

    /* checker::Type *ReturnType() noexcept */
    [get] checker.Type ReturnType(es2panda_Context context);

    /* const checker::Type *ReturnType() const noexcept */
    [get] checker.Type ReturnTypeConst(es2panda_Context context);

    /* void SetArgument(Expression *arg) */
    [set] void SetArgument(es2panda_Context context, ir.Expression arg);

    /* bool IsAsyncImplReturn() const */
    boolean IsAsyncImplReturnConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=27, c_type=es2panda_AstNode] interface ExportDefaultDeclaration: Statement {

    /* explicit ExportDefaultDeclaration(AstNode *decl, bool exportEquals) */
    static ir.ExportDefaultDeclaration Create(es2panda_Context context, ir.AstNode decl, boolean exportEquals);
    static ir.ExportDefaultDeclaration Update(es2panda_Context context, ir.ExportDefaultDeclaration original, ir.AstNode decl, boolean exportEquals);

    /* AstNode *Decl() */
    [get] ir.AstNode Decl(es2panda_Context context);

    /* const AstNode *Decl() const */
    [get] ir.AstNode DeclConst(es2panda_Context context);

    /* bool IsExportEquals() const */
    [get] boolean IsExportEqualsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=60, c_type=es2panda_AstNode] interface ScriptFunction: AstNode {

    /* explicit ScriptFunction(ArenaAllocator *allocator, ScriptFunctionData &&data) */
    static ir.ScriptFunction Create(es2panda_Context context, ir.AstNode databody, ir.FunctionSignature datasignature, i32 datafuncFlags, i32 dataflags);
    static ir.ScriptFunction Update(es2panda_Context context, ir.ScriptFunction original, ir.AstNode databody, ir.FunctionSignature datasignature, i32 datafuncFlags, i32 dataflags);

    /* explicit ScriptFunction(ArenaAllocator *allocator, ScriptFunctionData &&data) */
    static ir.ScriptFunction Create1(es2panda_Context context, ir.AstNode databody, ir.FunctionSignature datasignature, i32 datafuncFlags, i32 dataflags, Es2pandaLanguage datalang);
    static ir.ScriptFunction Update1(es2panda_Context context, ir.ScriptFunction original, ir.AstNode databody, ir.FunctionSignature datasignature, i32 datafuncFlags, i32 dataflags, Es2pandaLanguage datalang);

    /* [[nodiscard]] const Identifier *Id() const noexcept */
    [get] ir.Identifier IdConst(es2panda_Context context);

    /* [[nodiscard]] Identifier *Id() noexcept */
    [get] ir.Identifier Id(es2panda_Context context);

    /* [[nodiscard]] const checker::Signature *Signature() const noexcept */
    [get] checker.Signature SignatureConst(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() noexcept */
    [get] checker.Signature Signature(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &Params() const noexcept */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &Params() */
    sequence<ir.Expression> Params(es2panda_Context context);

    /* const ArenaVector<ReturnStatement *> &ReturnStatements() const */
    [get] sequence<ir.ReturnStatement> ReturnStatementsConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ReturnStatement *> &ReturnStatements() */
    sequence<ir.ReturnStatement> ReturnStatements(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ReturnStatement *> &ReturnStatementsForUpdate() */
    sequence<ir.ReturnStatement> ReturnStatementsForUpdate(es2panda_Context context);

    /* [[nodiscard]] const TSTypeParameterDeclaration *TypeParams() const noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] TSTypeParameterDeclaration *TypeParams() noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* void SetTypeParams(TSTypeParameterDeclaration *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* [[nodiscard]] const AstNode *Body() const noexcept */
    [get] ir.AstNode BodyConst(es2panda_Context context);

    /* [[nodiscard]] AstNode *Body() noexcept */
    [get] ir.AstNode Body(es2panda_Context context);

    /* void AddReturnStatement(ReturnStatement *returnStatement) */
    [set] void AddReturnStatement(es2panda_Context context, ir.ReturnStatement returnStatement);

    /* void SetBody(AstNode *body) */
    [set] void SetBody(es2panda_Context context, ir.AstNode body);

    /* [[nodiscard]] const TypeNode *ReturnTypeAnnotation() const noexcept */
    [get] ir.TypeNode ReturnTypeAnnotationConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *ReturnTypeAnnotation() noexcept */
    [get] ir.TypeNode ReturnTypeAnnotation(es2panda_Context context);

    /* void SetReturnTypeAnnotation(TypeNode *node) noexcept */
    [set] void SetReturnTypeAnnotation(es2panda_Context context, ir.TypeNode node);

    /* [[nodiscard]] bool IsEntryPoint() const noexcept */
    [get] boolean IsEntryPointConst(es2panda_Context context);

    /* [[nodiscard]] bool IsGenerator() const noexcept */
    [get] boolean IsGeneratorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsAsyncFunc() const noexcept */
    [get] boolean IsAsyncFuncConst(es2panda_Context context);

    /* [[nodiscard]] bool IsAsyncImplFunc() const noexcept */
    [get] boolean IsAsyncImplFuncConst(es2panda_Context context);

    /* [[nodiscard]] bool IsArrow() const noexcept */
    [get] boolean IsArrowConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOverload() const noexcept */
    [get] boolean IsOverloadConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExternalOverload() const */
    [get] boolean IsExternalOverloadConst(es2panda_Context context);

    /* [[nodiscard]] bool IsConstructor() const noexcept */
    [get] boolean IsConstructorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsGetter() const noexcept */
    [get] boolean IsGetterConst(es2panda_Context context);

    /* [[nodiscard]] bool IsSetter() const noexcept */
    [get] boolean IsSetterConst(es2panda_Context context);

    /* [[nodiscard]] bool IsGetterOrSetter() const noexcept */
    [get] boolean IsGetterOrSetterConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionAccessor() const noexcept */
    [get] boolean IsExtensionAccessorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsMethod() const noexcept */
    [get] boolean IsMethodConst(es2panda_Context context);

    /* [[nodiscard]] bool IsProxy() const noexcept */
    [get] boolean IsProxyConst(es2panda_Context context);

    /* [[nodiscard]] bool IsStaticBlock() const noexcept */
    [get] boolean IsStaticBlockConst(es2panda_Context context);

    /* [[nodiscard]] bool IsEnum() const noexcept */
    [get] boolean IsEnumConst(es2panda_Context context);

    /* [[nodiscard]] bool IsHidden() const noexcept */
    [get] boolean IsHiddenConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExternal() const noexcept */
    [get] boolean IsExternalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsImplicitSuperCallNeeded() const noexcept */
    [get] boolean IsImplicitSuperCallNeededConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExplicitThisCall() const noexcept */
    [get] boolean IsExplicitThisCallConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExplicitSuperCall() const noexcept */
    [get] boolean IsExplicitSuperCallConst(es2panda_Context context);

    /* [[nodiscard]] bool HasBody() const noexcept */
    [get] boolean HasBodyConst(es2panda_Context context);

    /* [[nodiscard]] bool HasRestParameter() const noexcept */
    boolean HasRestParameterConst(es2panda_Context context);

    /* [[nodiscard]] bool HasReturnStatement() const noexcept */
    [get] boolean HasReturnStatementConst(es2panda_Context context);

    /* [[nodiscard]] bool HasThrowStatement() const noexcept */
    [get] boolean HasThrowStatementConst(es2panda_Context context);

    /* [[nodiscard]] bool IsTrailingLambda() const noexcept */
    [get] boolean IsTrailingLambdaConst(es2panda_Context context);

    /* [[nodiscard]] bool IsSynthetic() const noexcept */
    [get] boolean IsSyntheticConst(es2panda_Context context);

    /* [[nodiscard]] bool IsInterfaceProperty() const noexcept */
    [get] boolean IsInterfacePropertyConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDynamic() const noexcept */
    [get] boolean IsDynamicConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionMethod() const noexcept */
    [get] boolean IsExtensionMethodConst(es2panda_Context context);

    /* [[nodiscard]] ir::ScriptFunctionFlags Flags() const noexcept */
    [get] Es2pandaScriptFunctionFlags FlagsConst(es2panda_Context context);

    /* [[nodiscard]] bool HasReceiver() const noexcept */
    [get] boolean HasReceiverConst(es2panda_Context context);

    /* void SetIdent(Identifier *id) noexcept */
    [set] void SetIdent(es2panda_Context context, ir.Identifier id);

    /* void SetSignature(checker::Signature *signature) */
    [set] void SetSignature(es2panda_Context context, checker.Signature signature);

    /* void AddFlag(ir::ScriptFunctionFlags flags) noexcept */
    [set] void AddFlag(es2panda_Context context, Es2pandaScriptFunctionFlags flags);

    /* void ClearFlag(ir::ScriptFunctionFlags flags) noexcept */
    void ClearFlag(es2panda_Context context, Es2pandaScriptFunctionFlags flags);

    /* [[nodiscard]] std::size_t FormalParamsLength() const noexcept */
    u32 FormalParamsLengthConst(es2panda_Context context);

    /* void SetScope(varbinder::FunctionScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.FunctionScope scope);

    /* [[nodiscard]] es2panda::Language Language() const noexcept */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* void SetPreferredReturnType(checker::Type *preferredReturnType) */
    [set] void SetPreferredReturnType(es2panda_Context context, checker.Type preferredReturnType);

    /* [[nodiscard]] checker::Type *GetPreferredReturnType() noexcept */
    [get] checker.Type GetPreferredReturnType(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *GetPreferredReturnType() const noexcept */
    [get] checker.Type GetPreferredReturnTypeConst(es2panda_Context context);

    /* void SetAsyncPairMethod(ScriptFunction *asyncPairFunction) */
    [set] void SetAsyncPairMethod(es2panda_Context context, ir.ScriptFunction asyncPairFunction);

    /* [[nodiscard]] const ScriptFunction *AsyncPairMethod() const noexcept */
    [get] ir.ScriptFunction AsyncPairMethodConst(es2panda_Context context);

    /* [[nodiscard]] ScriptFunction *AsyncPairMethod() noexcept */
    [get] ir.ScriptFunction AsyncPairMethod(es2panda_Context context);

    /* bool WasChecked() const */
    [get] boolean WasCheckedConst(es2panda_Context context);

    /* void SetWasChecked(bool wasChecked = true) */
    [set] void SetWasChecked(es2panda_Context context, boolean wasChecked);

    /* void EmplaceReturnStatements(ReturnStatement *returnStatements) */
    void EmplaceReturnStatements(es2panda_Context context, ir.ReturnStatement returnStatements);

    /* void ClearReturnStatements() */
    void ClearReturnStatements(es2panda_Context context);

    /* void SetValueReturnStatements(ReturnStatement *returnStatements, size_t index) */
    [set] void SetValueReturnStatements(es2panda_Context context, ir.ReturnStatement returnStatements, u32 index);

    /* void EmplaceParams(Expression *params) */
    void EmplaceParams(es2panda_Context context, ir.Expression params);

    /* void SetParams(ArenaVector<Expression *> &&paramsList) */
    [set] void SetParams(es2panda_Context context, sequence<ir.Expression> paramsList, u32 paramsListLen);

    /* void ClearParams() */
    void ClearParams(es2panda_Context context);

    /* void SetValueParams(Expression *params, size_t index) */
    [set] void SetValueParams(es2panda_Context context, ir.Expression params, u32 index);

    /* ArenaVector<Expression *> &ParamsForUpdate() */
    sequence<ir.Expression> ParamsForUpdate(es2panda_Context context);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=14, c_type=es2panda_AstNode] interface ClassDefinition: TypedAstNode {

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, TSTypeParameterDeclaration *typeParams,
                             TSTypeParameterInstantiation *superTypeParams,
                             ArenaVector<TSClassImplements *> &&implements, MethodDefinition *ctor,
                             Expression *superClass, ArenaVector<AstNode *> &&body, ClassDefinitionModifiers modifiers,
                             ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create(es2panda_Context context, ir.Identifier ident, ir.TSTypeParameterDeclaration typeParams, ir.TSTypeParameterInstantiation superTypeParams, sequence<ir.TSClassImplements> implements, u32 implementsLen, ir.MethodDefinition ctor, ir.Expression superClass, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);
    static ir.ClassDefinition Update(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, ir.TSTypeParameterDeclaration typeParams, ir.TSTypeParameterInstantiation superTypeParams, sequence<ir.TSClassImplements> implements, u32 implementsLen, ir.MethodDefinition ctor, ir.Expression superClass, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, ArenaVector<AstNode *> &&body,
                             ClassDefinitionModifiers modifiers, ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create1(es2panda_Context context, ir.Identifier ident, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);
    static ir.ClassDefinition Update1(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, ClassDefinitionModifiers modifiers,
                             ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create2(es2panda_Context context, ir.Identifier ident, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);
    static ir.ClassDefinition Update2(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags);

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, TSTypeParameterDeclaration *typeParams,
                             TSTypeParameterInstantiation *superTypeParams,
                             ArenaVector<TSClassImplements *> &&implements, MethodDefinition *ctor,
                             Expression *superClass, ArenaVector<AstNode *> &&body, ClassDefinitionModifiers modifiers,
                             ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create3(es2panda_Context context, ir.Identifier ident, ir.TSTypeParameterDeclaration typeParams, ir.TSTypeParameterInstantiation superTypeParams, sequence<ir.TSClassImplements> implements, u32 implementsLen, ir.MethodDefinition ctor, ir.Expression superClass, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);
    static ir.ClassDefinition Update3(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, ir.TSTypeParameterDeclaration typeParams, ir.TSTypeParameterInstantiation superTypeParams, sequence<ir.TSClassImplements> implements, u32 implementsLen, ir.MethodDefinition ctor, ir.Expression superClass, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, ArenaVector<AstNode *> &&body,
                             ClassDefinitionModifiers modifiers, ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create4(es2panda_Context context, ir.Identifier ident, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);
    static ir.ClassDefinition Update4(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, sequence<ir.AstNode> body, u32 bodyLen, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);

    /* explicit ClassDefinition(ArenaAllocator *allocator, Identifier *ident, ClassDefinitionModifiers modifiers,
                             ModifierFlags flags, Language lang) */
    static ir.ClassDefinition Create5(es2panda_Context context, ir.Identifier ident, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);
    static ir.ClassDefinition Update5(es2panda_Context context, ir.ClassDefinition original, ir.Identifier ident, Es2pandaClassDefinitionModifiers modifiers, Es2pandaModifierFlags flags, Es2pandaLanguage lang);

    /* [[nodiscard]] const Identifier *Ident() const noexcept */
    [get] ir.Identifier IdentConst(es2panda_Context context);

    /* [[nodiscard]] Identifier *Ident() noexcept */
    [get] ir.Identifier Ident(es2panda_Context context);

    /* void SetIdent(ir::Identifier *ident) noexcept */
    [set] void SetIdent(es2panda_Context context, ir.Identifier ident);

    /* [[nodiscard]] const util::StringView &InternalName() const noexcept */
    [get] String InternalNameConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Super() noexcept */
    [get] ir.Expression Super(es2panda_Context context);

    /* [[nodiscard]] const Expression *Super() const noexcept */
    [get] ir.Expression SuperConst(es2panda_Context context);

    /* void SetSuper(Expression *superClass) */
    [set] void SetSuper(es2panda_Context context, ir.Expression superClass);

    /* [[nodiscard]] bool IsGlobal() const noexcept */
    [get] boolean IsGlobalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsLocal() const noexcept */
    [get] boolean IsLocalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtern() const noexcept */
    [get] boolean IsExternConst(es2panda_Context context);

    /* [[nodiscard]] bool IsFromExternal() const noexcept */
    [get] boolean IsFromExternalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsInner() const noexcept */
    [get] boolean IsInnerConst(es2panda_Context context);

    /* [[nodiscard]] bool IsGlobalInitialized() const noexcept */
    [get] boolean IsGlobalInitializedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsClassDefinitionChecked() const noexcept */
    [get] boolean IsClassDefinitionCheckedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsAnonymous() const noexcept */
    [get] boolean IsAnonymousConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNumericEnumTransformed() const noexcept */
    [get] boolean IsNumericEnumTransformedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsStringEnumTransformed() const noexcept */
    [get] boolean IsStringEnumTransformedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsEnumTransformed() const noexcept */
    [get] boolean IsEnumTransformedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNamespaceTransformed() const noexcept */
    [get] boolean IsNamespaceTransformedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsLazyImportObjectClass() const noexcept */
    [get] boolean IsLazyImportObjectClassConst(es2panda_Context context);

    /* [[nodiscard]] bool IsFromStruct() const noexcept */
    [get] boolean IsFromStructConst(es2panda_Context context);

    /* [[nodiscard]] bool IsInitInCctor() const noexcept */
    [get] boolean IsInitInCctorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsModule() const noexcept */
    [get] boolean IsModuleConst(es2panda_Context context);

    /* [[nodiscard]] bool IsFromLambda() const noexcept */
    [get] boolean IsFromLambdaConst(es2panda_Context context);

    /* [[nodiscard]] es2panda::Language Language() const noexcept */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* void SetGlobalInitialized() noexcept */
    [set] void SetGlobalInitialized(es2panda_Context context);

    /* void SetInnerModifier() noexcept */
    [set] void SetInnerModifier(es2panda_Context context);

    /* void SetClassDefinitionChecked() noexcept */
    [set] void SetClassDefinitionChecked(es2panda_Context context);

    /* void SetAnonymousModifier() noexcept */
    [set] void SetAnonymousModifier(es2panda_Context context);

    /* void SetNamespaceTransformed() noexcept */
    [set] void SetNamespaceTransformed(es2panda_Context context);

    /* void SetLazyImportObjectClass() noexcept */
    [set] void SetLazyImportObjectClass(es2panda_Context context);

    /* void SetFromStructModifier() noexcept */
    [set] void SetFromStructModifier(es2panda_Context context);

    /* void SetInitInCctor() */
    [set] void SetInitInCctor(es2panda_Context context);

    /* [[nodiscard]] ClassDefinitionModifiers Modifiers() const noexcept */
    [get] Es2pandaClassDefinitionModifiers ModifiersConst(es2panda_Context context);

    /* void AddProperties(ArenaVector<AstNode *> &&body) */
    [set] void AddProperties(es2panda_Context context, sequence<ir.AstNode> body, u32 bodyLen);

    /* [[nodiscard]] const ArenaVector<AstNode *> &Body() const noexcept */
    [get] sequence<ir.AstNode> BodyConst(es2panda_Context context);

    /* [[nodiscard]] MethodDefinition *Ctor() noexcept */
    [get] ir.MethodDefinition Ctor(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::TSClassImplements *> &Implements() const noexcept */
    [get] sequence<ir.TSClassImplements> ImplementsConst(es2panda_Context context);

    /* [[nodiscard]] const ir::TSTypeParameterDeclaration *TypeParams() const noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] ir::TSTypeParameterDeclaration *TypeParams() noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* const TSTypeParameterInstantiation *SuperTypeParams() const */
    [get] ir.TSTypeParameterInstantiation SuperTypeParamsConst(es2panda_Context context);

    /* TSTypeParameterInstantiation *SuperTypeParams() */
    [get] ir.TSTypeParameterInstantiation SuperTypeParams(es2panda_Context context);

    /* void SetSuperTypeParams(TSTypeParameterInstantiation *superTypeParams) */
    [set] void SetSuperTypeParams(es2panda_Context context, ir.TSTypeParameterInstantiation superTypeParams);

    /* [[nodiscard]] static int LocalTypeCounter() noexcept */
    [get] i32 LocalTypeCounter(es2panda_Context context);

    /* [[nodiscard]] int LocalIndex() const noexcept */
    [get] i32 LocalIndexConst(es2panda_Context context);

    /* [[nodiscard]] MethodDefinition *FunctionalReferenceReferencedMethod() const noexcept */
    [get] ir.MethodDefinition FunctionalReferenceReferencedMethodConst(es2panda_Context context);

    /* void SetFunctionalReferenceReferencedMethod(MethodDefinition *functionalReferenceReferencedMethod) */
    [set] void SetFunctionalReferenceReferencedMethod(es2panda_Context context, ir.MethodDefinition functionalReferenceReferencedMethod);

    /* [[nodiscard]] const std::string &LocalPrefix() const noexcept */
    [get] String LocalPrefixConst(es2panda_Context context);

    /* bool CaptureVariable(varbinder::Variable *var) */
    boolean CaptureVariable(es2panda_Context context, varbinder.Variable var);

    /* bool AddToLocalVariableIsNeeded(varbinder::Variable *var) */
    [set] boolean AddToLocalVariableIsNeeded(es2panda_Context context, varbinder.Variable var);

    /* bool IsLocalVariableNeeded(varbinder::Variable *var) const */
    boolean IsLocalVariableNeededConst(es2panda_Context context, varbinder.Variable var);

    /* [[nodiscard]] const ArenaSet<varbinder::Variable *> &CapturedVariables() const noexcept */
    [get] sequence<varbinder.Variable> CapturedVariablesConst(es2panda_Context context);

    /* bool EraseCapturedVariable(varbinder::Variable *var) */
    boolean EraseCapturedVariable(es2panda_Context context, varbinder.Variable var);

    /* ir::TSEnumDeclaration *OrigEnumDecl() const */
    [get] ir.TSEnumDeclaration OrigEnumDeclConst(es2panda_Context context);

    /* ClassDeclaration *GetAnonClass() noexcept */
    [get] ir.ClassDeclaration GetAnonClass(es2panda_Context context);

    /* const FunctionExpression *Ctor() const */
    ir.FunctionExpression CtorConst(es2panda_Context context);

    /* bool HasPrivateMethod() const */
    boolean HasPrivateMethodConst(es2panda_Context context);

    /* bool HasNativeMethod() const */
    boolean HasNativeMethodConst(es2panda_Context context);

    /* bool HasComputedInstanceField() const */
    boolean HasComputedInstanceFieldConst(es2panda_Context context);

    /* bool HasMatchingPrivateKey(const util::StringView &name) const */
    boolean HasMatchingPrivateKeyConst(es2panda_Context context, String name);

    /* void TransformBase(const NodeTransformer &cb, std::string_view transformationName) */
    void TransformBase(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void AddToExportedClasses(const ir::ClassDeclaration *cls) */
    [set] void AddToExportedClasses(es2panda_Context context, ir.ClassDeclaration cls);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* void SetModifiers(ClassDefinitionModifiers modifiers) */
    [set] void SetModifiers(es2panda_Context context, Es2pandaClassDefinitionModifiers modifiers);

    /* void EmplaceBody(AstNode *body) */
    void EmplaceBody(es2panda_Context context, ir.AstNode body);

    /* void ClearBody() */
    void ClearBody(es2panda_Context context);

    /* void SetValueBody(AstNode *body, size_t index) */
    [set] void SetValueBody(es2panda_Context context, ir.AstNode body, u32 index);

    /* const ArenaVector<AstNode *> &Body() */
    sequence<ir.AstNode> Body(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<AstNode *> &BodyForUpdate() */
    sequence<ir.AstNode> BodyForUpdate(es2panda_Context context);

    /* void EmplaceImplements(TSClassImplements *implements) */
    void EmplaceImplements(es2panda_Context context, ir.TSClassImplements implements);

    /* void ClearImplements() */
    void ClearImplements(es2panda_Context context);

    /* void SetValueImplements(TSClassImplements *implements, size_t index) */
    [set] void SetValueImplements(es2panda_Context context, ir.TSClassImplements implements, u32 index);

    /* void SetImplements(ArenaVector<TSClassImplements *> &&implementsList) */
    [set] void SetImplements(es2panda_Context context, sequence<ir.TSClassImplements> implementsList, u32 implementsListLen);

    /* const ArenaVector<TSClassImplements *> &Implements() */
    sequence<ir.TSClassImplements> Implements(es2panda_Context context);

    /* ArenaVector<TSClassImplements *> &ImplementsForUpdate() */
    sequence<ir.TSClassImplements> ImplementsForUpdate(es2panda_Context context);

    /* void SetCtor(MethodDefinition *ctor) */
    [set] void SetCtor(es2panda_Context context, ir.MethodDefinition ctor);

    /* void SetTypeParams(TSTypeParameterDeclaration *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* void SetOrigEnumDecl(TSEnumDeclaration *origEnumDecl) */
    [set] void SetOrigEnumDecl(es2panda_Context context, ir.TSEnumDeclaration origEnumDecl);

    /* void SetAnonClass(ClassDeclaration *anonClass) */
    [set] void SetAnonClass(es2panda_Context context, ir.ClassDeclaration anonClass);

    /* void SetInternalName(util::StringView internalName) */
    [set] void SetInternalName(es2panda_Context context, String internalName);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=161, c_type=es2panda_AstNode] interface ArrayExpression: AnnotatedExpression {

    /* explicit ArrayExpression(ArenaVector<Expression *> &&elements, ArenaAllocator *const allocator) */
    static ir.ArrayExpression Create(es2panda_Context context, sequence<ir.Expression> elements, u32 elementsLen);
    static ir.ArrayExpression Update(es2panda_Context context, ir.ArrayExpression original, sequence<ir.Expression> elements, u32 elementsLen);

    /* explicit ArrayExpression(AstNodeType nodeType, ArenaVector<Expression *> &&elements,
                             [[maybe_unused]] ArenaAllocator *const allocator, bool const trailingComma) */
    static ir.ArrayExpression Create1(es2panda_Context context, Es2pandaAstNodeType nodeType, sequence<ir.Expression> elements, u32 elementsLen, boolean trailingComma);
    static ir.ArrayExpression Update1(es2panda_Context context, ir.ArrayExpression original, Es2pandaAstNodeType nodeType, sequence<ir.Expression> elements, u32 elementsLen, boolean trailingComma);

    /* [[nodiscard]] Expression *GetElementNodeAtIdx(const size_t idx) const noexcept */
    [get] ir.Expression GetElementNodeAtIdxConst(es2panda_Context context, u32 idx);

    /* [[nodiscard]] const ArenaVector<Expression *> &Elements() const noexcept */
    [get] sequence<ir.Expression> ElementsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Expression *> &Elements() noexcept */
    [get] sequence<ir.Expression> Elements(es2panda_Context context);

    /* void SetElements(ArenaVector<Expression *> &&elements) noexcept */
    [set] void SetElements(es2panda_Context context, sequence<ir.Expression> elements, u32 elementsLen);

    /* [[nodiscard]] bool IsDeclaration() const noexcept */
    [get] boolean IsDeclarationConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* void SetDeclaration() noexcept */
    [set] void SetDeclaration(es2panda_Context context);

    /* void SetOptional(bool optional) noexcept */
    [set] void SetOptional(es2panda_Context context, boolean optional_arg);

    /* [[nodiscard]] bool ConvertibleToArrayPattern() */
    boolean ConvertibleToArrayPattern(es2panda_Context context);

    /* bool TrySetPreferredTypeForNestedArrayExpr(checker::ETSChecker *checker, ArrayExpression *nestedArrayExpr,
                                               std::size_t idx) const */
    boolean TrySetPreferredTypeForNestedArrayExprConst(es2panda_Context context, ir.ArrayExpression nestedArrayExpr, u32 idx);

    /* void SetPreferredTypeOnFuncParam(checker::ETSChecker *checker, checker::Type *param,
                                     checker::TypeRelationFlag flags) */
    [set] void SetPreferredTypeOnFuncParam(es2panda_Context context, checker.Type param, Es2pandaTypeRelationFlag flags);

    /* void SetPreferredTypeBasedOnFuncParam(checker::ETSChecker *checker, checker::Type *param,
                                          checker::TypeRelationFlag flags) */
    [set] void SetPreferredTypeBasedOnFuncParam(es2panda_Context context, checker.Type param, Es2pandaTypeRelationFlag flags);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=136, c_type=es2panda_AstNode] interface TSInterfaceBody: Expression {

    /* explicit TSInterfaceBody(ArenaVector<AstNode *> &&body) */
    static ir.TSInterfaceBody Create(es2panda_Context context, sequence<ir.AstNode> body, u32 bodyLen);
    static ir.TSInterfaceBody Update(es2panda_Context context, ir.TSInterfaceBody original, sequence<ir.AstNode> body, u32 bodyLen);

    /* [[nodiscard]] ArenaVector<AstNode *> *BodyPtr() */
    [get] sequence<ir.AstNode> BodyPtr(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<AstNode *> &Body() noexcept */
    [get] sequence<ir.AstNode> Body(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<AstNode *> const &Body() const noexcept */
    [get] sequence<ir.AstNode> BodyConst(es2panda_Context context);

    /* void SetBody(ArenaVector<AstNode *> &&statementList) */
    [set] void SetBody(es2panda_Context context, sequence<ir.AstNode> statementList, u32 statementListLen);
};

[Entity=Class, Es2pandaAstNodeType=141, c_type=es2panda_AstNode] interface TSTypeQuery: TypeNode {

    /* explicit TSTypeQuery(Expression *exprName, ArenaAllocator *const allocator) */
    static ir.TSTypeQuery Create(es2panda_Context context, ir.Expression exprName);
    static ir.TSTypeQuery Update(es2panda_Context context, ir.TSTypeQuery original, ir.Expression exprName);

    /* const Expression *ExprName() const */
    [get] ir.Expression ExprNameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=102, c_type=es2panda_AstNode] interface TSBigintKeyword: TypeNode {

    /* explicit TSBigintKeyword(ArenaAllocator *const allocator) */
    static ir.TSBigintKeyword Create(es2panda_Context context);
    static ir.TSBigintKeyword Update(es2panda_Context context, ir.TSBigintKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=56, c_type=es2panda_AstNode] interface Property: Expression {

    /* explicit Property(Expression *const key, Expression *const value) */
    static ir.Property Create(es2panda_Context context, ir.Expression key, ir.Expression value);
    static ir.Property Update(es2panda_Context context, ir.Property original, ir.Expression key, ir.Expression value);

    /* explicit Property(PropertyKind const kind, Expression *const key, Expression *const value, bool const isMethod,
                      bool const isComputed) */
    static ir.Property Create1(es2panda_Context context, Es2pandaPropertyKind kind, ir.Expression key, ir.Expression value, boolean isMethod, boolean isComputed);
    static ir.Property Update1(es2panda_Context context, ir.Property original, Es2pandaPropertyKind kind, ir.Expression key, ir.Expression value, boolean isMethod, boolean isComputed);

    /* [[nodiscard]] Expression *Key() noexcept */
    [get] ir.Expression Key(es2panda_Context context);

    /* [[nodiscard]] const Expression *Key() const noexcept */
    [get] ir.Expression KeyConst(es2panda_Context context);

    /* void SetKey(Expression *key) */
    [set] void SetKey(es2panda_Context context, ir.Expression key);

    /* [[nodiscard]] const Expression *Value() const noexcept */
    [get] ir.Expression ValueConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Value() noexcept */
    [get] ir.Expression Value(es2panda_Context context);

    /* void SetValue(Expression *value) noexcept */
    [set] void SetValue(es2panda_Context context, ir.Expression value);

    /* [[nodiscard]] PropertyKind Kind() const noexcept */
    [get] Es2pandaPropertyKind KindConst(es2panda_Context context);

    /* void SetKind(PropertyKind kind) noexcept */
    [set] void SetKind(es2panda_Context context, Es2pandaPropertyKind kind);

    /* [[nodiscard]] bool IsMethod() const noexcept */
    [get] boolean IsMethodConst(es2panda_Context context);

    /* [[nodiscard]] bool IsShorthand() const noexcept */
    [get] boolean IsShorthandConst(es2panda_Context context);

    /* [[nodiscard]] bool IsComputed() const noexcept */
    [get] boolean IsComputedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsAccessor() const noexcept */
    [get] boolean IsAccessorConst(es2panda_Context context);

    /* [[nodiscard]] static bool IsAccessorKind(PropertyKind kind) noexcept */
    [get] boolean IsAccessorKind(es2panda_Context context, Es2pandaPropertyKind kind);

    /* bool ConvertibleToPatternProperty() */
    boolean ConvertibleToPatternProperty(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=155, c_type=es2panda_AstNode] interface VariableDeclarator: TypedStatement {

    /* explicit VariableDeclarator(VariableDeclaratorFlag flag, Expression *ident) */
    static ir.VariableDeclarator Create(es2panda_Context context, Es2pandaVariableDeclaratorFlag flag, ir.Expression ident);
    static ir.VariableDeclarator Update(es2panda_Context context, ir.VariableDeclarator original, Es2pandaVariableDeclaratorFlag flag, ir.Expression ident);

    /* explicit VariableDeclarator(VariableDeclaratorFlag flag, Expression *ident, Expression *init) */
    static ir.VariableDeclarator Create1(es2panda_Context context, Es2pandaVariableDeclaratorFlag flag, ir.Expression ident, ir.Expression init);
    static ir.VariableDeclarator Update1(es2panda_Context context, ir.VariableDeclarator original, Es2pandaVariableDeclaratorFlag flag, ir.Expression ident, ir.Expression init);

    /* Expression *Init() */
    [get] ir.Expression Init(es2panda_Context context);

    /* const Expression *Init() const */
    [get] ir.Expression InitConst(es2panda_Context context);

    /* void SetInit(Expression *init) */
    [set] void SetInit(es2panda_Context context, ir.Expression init);

    /* Expression *Id() */
    [get] ir.Expression Id(es2panda_Context context);

    /* const Expression *Id() const */
    [get] ir.Expression IdConst(es2panda_Context context);

    /* void SetId(Expression *id) */
    [set] void SetId(es2panda_Context context, ir.Expression id);

    /* VariableDeclaratorFlag Flag() */
    [get] Es2pandaVariableDeclaratorFlag Flag(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=62, c_type=es2panda_AstNode] interface StringLiteral: Literal {

    /* explicit StringLiteral() */
    static ir.StringLiteral Create(es2panda_Context context);
    static ir.StringLiteral Update(es2panda_Context context, ir.StringLiteral original);

    /* explicit StringLiteral(util::StringView str) */
    static ir.StringLiteral Create1(es2panda_Context context, String str);
    static ir.StringLiteral Update1(es2panda_Context context, ir.StringLiteral original, String str);

    /* [[nodiscard]] util::StringView Str() const */
    [get] String StrConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=144, c_type=es2panda_AstNode] interface TSTypeAssertion: AnnotatedExpression {

    /* explicit TSTypeAssertion(TypeNode *typeAnnotation, Expression *expression) */
    static ir.TSTypeAssertion Create(es2panda_Context context, ir.TypeNode typeAnnotation, ir.Expression expression);
    static ir.TSTypeAssertion Update(es2panda_Context context, ir.TSTypeAssertion original, ir.TypeNode typeAnnotation, ir.Expression expression);

    /* const Expression *GetExpression() const */
    [get] ir.Expression GetExpressionConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=93, c_type=es2panda_AstNode] interface TSExternalModuleReference: Expression {

    /* explicit TSExternalModuleReference(Expression *expr) */
    static ir.TSExternalModuleReference Create(es2panda_Context context, ir.Expression expr);
    static ir.TSExternalModuleReference Update(es2panda_Context context, ir.TSExternalModuleReference original, ir.Expression expr);

    /* const Expression *Expr() const */
    [get] ir.Expression ExprConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=99, c_type=es2panda_AstNode] interface TSUndefinedKeyword: TypeNode {

    /* explicit TSUndefinedKeyword(ArenaAllocator *const allocator) */
    static ir.TSUndefinedKeyword Create(es2panda_Context context);
    static ir.TSUndefinedKeyword Update(es2panda_Context context, ir.TSUndefinedKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=85, c_type=es2panda_AstNode] interface ETSTuple: TypeNode {

    /* explicit ETSTuple(ArenaAllocator *const allocator) */
    static ir.ETSTuple Create(es2panda_Context context);
    static ir.ETSTuple Update(es2panda_Context context, ir.ETSTuple original);

    /* explicit ETSTuple(ArenaAllocator *const allocator, const TupleSizeType size) */
    static ir.ETSTuple Create1(es2panda_Context context, u32 size);
    static ir.ETSTuple Update1(es2panda_Context context, ir.ETSTuple original, u32 size);

    /* explicit ETSTuple(const ArenaVector<ir::TypeNode *> &typeList, ArenaAllocator *const allocator) */
    static ir.ETSTuple Create2(es2panda_Context context, sequence<ir.TypeNode> typeList, u32 typeListLen);
    static ir.ETSTuple Update2(es2panda_Context context, ir.ETSTuple original, sequence<ir.TypeNode> typeList, u32 typeListLen);

    /* [[nodiscard]] TupleSizeType GetTupleSize() const */
    [get] u32 GetTupleSizeConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::TypeNode *> &GetTupleTypeAnnotationsList() */
    [get] sequence<ir.TypeNode> GetTupleTypeAnnotationsList(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::TypeNode *> &GetTupleTypeAnnotationsList() const noexcept */
    [get] sequence<ir.TypeNode> GetTupleTypeAnnotationsListConst(es2panda_Context context);

    /* void SetTypeAnnotationsList(ArenaVector<TypeNode *> &&typeNodeList) */
    [set] void SetTypeAnnotationsList(es2panda_Context context, sequence<ir.TypeNode> typeNodeList, u32 typeNodeListLen);

    /* static checker::Type *GetHolderTypeForTuple(checker::ETSChecker *checker, ArenaVector<checker::Type *> &typeList) */
    checker.Type GetHolderTypeForTuple(es2panda_Context context, sequence<checker.Type> typeList, u32 typeListLen);
};

[Entity=Class, Es2pandaAstNodeType=67, c_type=es2panda_AstNode] interface ETSStringLiteralType: TypeNode {

    /* explicit ETSStringLiteralType(const util::StringView &value, ArenaAllocator *const allocator) */
    static ir.ETSStringLiteralType Create(es2panda_Context context, String value);
    static ir.ETSStringLiteralType Update(es2panda_Context context, ir.ETSStringLiteralType original, String value);
};

[Entity=Class, Es2pandaAstNodeType=151, c_type=es2panda_AstNode] interface TryStatement: Statement {

    /* explicit TryStatement(BlockStatement *block, ArenaVector<CatchClause *> &&catchClauses, BlockStatement *finalizer,
                          ArenaVector<compiler::LabelPair> finalizerInsertionsLabelPair,
                          ArenaVector<Statement *> finalizerInsertionsStatement) */
    static ir.TryStatement Create(es2panda_Context context, ir.BlockStatement block, sequence<ir.CatchClause> catchClauses, u32 catchClausesLen, ir.BlockStatement finalizer, sequence<es2panda_LabelPair> finalizerInsertionsLabelPair, u32 finalizerInsertionsLabelPairLen, sequence<ir.Statement> finalizerInsertionsStatement, u32 finalizerInsertionsStatementLen);
    static ir.TryStatement Update(es2panda_Context context, ir.TryStatement original, ir.BlockStatement block, sequence<ir.CatchClause> catchClauses, u32 catchClausesLen, ir.BlockStatement finalizer, sequence<es2panda_LabelPair> finalizerInsertionsLabelPair, u32 finalizerInsertionsLabelPairLen, sequence<ir.Statement> finalizerInsertionsStatement, u32 finalizerInsertionsStatementLen);

    /* explicit TryStatement(TryStatement const &other, ArenaAllocator *allocator) */
    static ir.TryStatement Create1(es2panda_Context context, ir.TryStatement other);
    static ir.TryStatement Update1(es2panda_Context context, ir.TryStatement original, ir.TryStatement other);

    /* BlockStatement *FinallyBlock() const */
    [get] ir.BlockStatement FinallyBlockConst(es2panda_Context context);

    /* void SetFinallyBlock(BlockStatement *finallyBlock) */
    [set] void SetFinallyBlock(es2panda_Context context, ir.BlockStatement finallyBlock);

    /* BlockStatement *Block() const */
    [get] ir.BlockStatement BlockConst(es2panda_Context context);

    /* void SetBlock(BlockStatement *block) */
    [set] void SetBlock(es2panda_Context context, ir.BlockStatement block);

    /* std::pair<compiler::LabelPair, const Statement *> AddFinalizerInsertion(compiler::LabelPair insertion,
                                                                            const Statement *insertionStmt) */
    [set] es2panda_LabelPair AddFinalizerInsertion(es2panda_Context context, es2panda_LabelPair insertion, ir.Statement insertionStmt, sequence<ir.Statement> returnTypeSecond);

    /* [[nodiscard]] bool HasFinalizer() const noexcept */
    [get] boolean HasFinalizerConst(es2panda_Context context);

    /* bool HasDefaultCatchClause() const */
    boolean HasDefaultCatchClauseConst(es2panda_Context context);

    /* const ArenaVector<CatchClause *> &CatchClauses() const */
    [get] sequence<ir.CatchClause> CatchClausesConst(es2panda_Context context);

    /* void SetCatchClauses(ArenaVector<CatchClause *> &&catchClausesList) */
    [set] void SetCatchClauses(es2panda_Context context, sequence<ir.CatchClause> catchClausesList, u32 catchClausesListLen);

    /* bool FinallyCanCompleteNormally() const */
    [get] boolean FinallyCanCompleteNormallyConst(es2panda_Context context);

    /* void SetFinallyCanCompleteNormally(bool finallyCanCompleteNormally) */
    [set] void SetFinallyCanCompleteNormally(es2panda_Context context, boolean finallyCanCompleteNormally);
};

[Entity=Class, c_type=es2panda_AstNode] interface AstNode {

    /* bool IsProgram() const */
    [get] boolean IsProgramConst(es2panda_Context context);

    /* [[nodiscard]] virtual bool IsStatement() const noexcept */
    [get] boolean IsStatementConst(es2panda_Context context);

    /* [[nodiscard]] virtual bool IsExpression() const noexcept */
    [get] boolean IsExpressionConst(es2panda_Context context);

    /* virtual bool IsTyped() const */
    [get] boolean IsTypedConst(es2panda_Context context);

    /* Typed<AstNode> *AsTyped() */
    ir.AstNode AsTyped(es2panda_Context context);

    /* Typed<AstNode> const *AsTyped() const */
    ir.AstNode AsTypedConst(es2panda_Context context);

    /* bool IsBrokenStatement() const */
    [get] boolean IsBrokenStatementConst(es2panda_Context context);

    /* Expression *AsExpression() */
    ir.Expression AsExpression(es2panda_Context context);

    /* const Expression *AsExpression() const */
    ir.Expression AsExpressionConst(es2panda_Context context);

    /* Statement *AsStatement() */
    ir.Statement AsStatement(es2panda_Context context);

    /* const Statement *AsStatement() const */
    ir.Statement AsStatementConst(es2panda_Context context);

    /* void SetRange(const lexer::SourceRange &loc) noexcept */
    void SetRange(es2panda_Context context, es2panda_SourceRange loc);

    /* void SetProgram(const parser::Program *program) noexcept */
    [set] void SetProgram(es2panda_Context context, parser.Program program);

    /* void SetStart(const lexer::SourcePosition &start) noexcept */
    void SetStart(es2panda_Context context, es2panda_SourcePosition start);

    /* void SetEnd(const lexer::SourcePosition &end) noexcept */
    void SetEnd(es2panda_Context context, es2panda_SourcePosition end);

    /* [[nodiscard]] const parser::Program *Program() const noexcept */
    [get] parser.Program ProgramConst(es2panda_Context context);

    /* [[nodiscard]] lexer::SourcePosition Start() const noexcept */
    [get] es2panda_SourcePosition StartConst(es2panda_Context context);

    /* [[nodiscard]] lexer::SourcePosition End() const noexcept */
    [get] es2panda_SourcePosition EndConst(es2panda_Context context);

    /* [[nodiscard]] lexer::SourceRange Range() const noexcept */
    [get] es2panda_SourceRange RangeConst(es2panda_Context context);

    /* [[nodiscard]] AstNodeType Type() const noexcept */
    Es2pandaAstNodeType TypeConst(es2panda_Context context);

    /* [[nodiscard]] AstNode *Parent() noexcept */
    [get] ir.AstNode Parent(es2panda_Context context);

    /* [[nodiscard]] const AstNode *Parent() const noexcept */
    [get] ir.AstNode ParentConst(es2panda_Context context);

    /* void SetParent(AstNode *const parent) noexcept */
    void SetParent(es2panda_Context context, ir.AstNode parent);

    /* [[nodiscard]] varbinder::Variable *Variable() const noexcept */
    [get] varbinder.Variable VariableConst(es2panda_Context context);

    /* void SetVariable(varbinder::Variable *variable) noexcept */
    [set] void SetVariable(es2panda_Context context, varbinder.Variable variable);

    /* virtual const ArenaVector<ir::Decorator *> *DecoratorsPtr() const */
    [get] sequence<ir.Decorator> DecoratorsPtrConst(es2panda_Context context);

    /* virtual void AddDecorators([[maybe_unused]] ArenaVector<ir::Decorator *> &&decorators) */
    [set] void AddDecorators(es2panda_Context context, sequence<ir.Decorator> decorators, u32 decoratorsLen);

    /* virtual bool CanHaveDecorator([[maybe_unused]] bool inTs) const */
    [get] boolean CanHaveDecoratorConst(es2panda_Context context, boolean inTs);

    /* [[nodiscard]] bool IsReadonly() const noexcept */
    boolean IsReadonlyConst(es2panda_Context context);

    /* [[nodiscard]] bool IsReadonlyType() const noexcept */
    boolean IsReadonlyTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOptionalDeclaration() const noexcept */
    boolean IsOptionalDeclarationConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDefinite() const noexcept */
    boolean IsDefiniteConst(es2panda_Context context);

    /* [[nodiscard]] bool IsConstructor() const noexcept */
    boolean IsConstructorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOverride() const noexcept */
    boolean IsOverrideConst(es2panda_Context context);

    /* void SetOverride() noexcept */
    [set] void SetOverride(es2panda_Context context);

    /* [[nodiscard]] bool IsAsync() const noexcept */
    [get] boolean IsAsyncConst(es2panda_Context context);

    /* [[nodiscard]] bool IsSynchronized() const noexcept */
    [get] boolean IsSynchronizedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNative() const noexcept */
    [get] boolean IsNativeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsConst() const noexcept */
    [get] boolean IsConstConst(es2panda_Context context);

    /* [[nodiscard]] bool IsStatic() const noexcept */
    [get] boolean IsStaticConst(es2panda_Context context);

    /* [[nodiscard]] bool IsFinal() const noexcept */
    [get] boolean IsFinalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsAbstract() const noexcept */
    [get] boolean IsAbstractConst(es2panda_Context context);

    /* [[nodiscard]] bool IsPublic() const noexcept */
    [get] boolean IsPublicConst(es2panda_Context context);

    /* [[nodiscard]] bool IsProtected() const noexcept */
    [get] boolean IsProtectedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsPrivate() const noexcept */
    [get] boolean IsPrivateConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExported() const noexcept */
    boolean IsExportedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDefaultExported() const noexcept */
    boolean IsDefaultExportedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExportedType() const noexcept */
    boolean IsExportedTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDeclare() const noexcept */
    [get] boolean IsDeclareConst(es2panda_Context context);

    /* [[nodiscard]] bool IsIn() const noexcept */
    [get] boolean IsInConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOut() const noexcept */
    [get] boolean IsOutConst(es2panda_Context context);

    /* [[nodiscard]] bool IsSetter() const noexcept */
    [get] boolean IsSetterConst(es2panda_Context context);

    /* void AddModifier(ModifierFlags const flags) noexcept */
    [set] void AddModifier(es2panda_Context context, Es2pandaModifierFlags flags);

    /* void ClearModifier(ModifierFlags const flags) noexcept */
    void ClearModifier(es2panda_Context context, Es2pandaModifierFlags flags);

    /* [[nodiscard]] ModifierFlags Modifiers() noexcept */
    Es2pandaModifierFlags Modifiers(es2panda_Context context);

    /* [[nodiscard]] ModifierFlags Modifiers() const noexcept */
    Es2pandaModifierFlags ModifiersConst(es2panda_Context context);

    /* [[nodiscard]] bool HasExportAlias() const noexcept */
    boolean HasExportAliasConst(es2panda_Context context);

    /* [[nodiscard]] AstNodeFlags Flags() noexcept */
    Es2pandaAstNodeFlags Flags(es2panda_Context context);

    /* [[nodiscard]] AstNodeFlags Flags() const noexcept */
    Es2pandaAstNodeFlags FlagsConst(es2panda_Context context);

    /* ir::ClassElement *AsClassElement() */
    ir.ClassElement AsClassElement(es2panda_Context context);

    /* const ir::ClassElement *AsClassElement() const */
    ir.ClassElement AsClassElementConst(es2panda_Context context);

    /* [[nodiscard]] static varbinder::Scope *EnclosingScope(const ir::AstNode *expr) noexcept */
    varbinder.Scope EnclosingScope(es2panda_Context context, ir.AstNode expr);

    /* [[nodiscard]] virtual bool IsScopeBearer() const noexcept */
    boolean IsScopeBearerConst(es2panda_Context context);

    /* [[nodiscard]] virtual varbinder::Scope *Scope() const noexcept */
    varbinder.Scope ScopeConst(es2panda_Context context);

    /* virtual void ClearScope() noexcept */
    void ClearScope(es2panda_Context context);

    /* [[nodiscard]] ir::BlockStatement *GetTopStatement() */
    ir.BlockStatement GetTopStatement(es2panda_Context context);

    /* [[nodiscard]] const ir::BlockStatement *GetTopStatement() const */
    ir.BlockStatement GetTopStatementConst(es2panda_Context context);

    /* [[nodiscard]] virtual AstNode *Clone(ArenaAllocator *const allocator, AstNode *const parent) */
    ir.AstNode Clone(es2panda_Context context, ir.AstNode parent);

    /* virtual void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) = 0 */
    void TransformChildren(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* virtual void Iterate(const NodeTraverser &cb) const = 0 */
    void IterateConst(es2panda_Context context, NodeTraverser cb);

    /* void TransformChildrenRecursively(const NodeTransformer &cb, std::string_view transformationName) */
    [get] void TransformChildrenRecursively(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* bool IsAnyChild(const NodePredicate &cb) const */
    [get] boolean IsAnyChildConst(es2panda_Context context, NodePredicate cb);

    /* std::string DumpJSON() const */
    String DumpJSONConst(es2panda_Context context);

    /* std::string DumpEtsSrc() const */
    String DumpEtsSrcConst(es2panda_Context context);

    /* std::string DumpDecl(public_lib::Context *context) const */
    String DumpDeclConst(es2panda_Context context);

    /* std::string DumpEtsSrcWithJsdoc() const */
    String DumpEtsSrcWithJsdocConst(es2panda_Context context);

    /* virtual void Dump(ir::AstDumper *dumper) const = 0 */
    void DumpConst(es2panda_Context context, ir.AstDumper dumper);

    /* virtual void Dump(ir::SrcDumper *dumper) const = 0 */
    void DumpConst1(es2panda_Context context, ir.SrcDumper dumper);

    /* virtual void Compile([[maybe_unused]] compiler::PandaGen *pg) const = 0 */
    void CompileConst(es2panda_Context context, es2panda_CodeGen pg);

    /* virtual void Compile([[maybe_unused]] compiler::ETSGen *etsg) const */
    void CompileConst1(es2panda_Context context, es2panda_CodeGen etsg);

    /* virtual checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) = 0 */
    checker.Type Check(es2panda_Context context);

    /* void SetTransformedNode(std::string_view transformationName, AstNode *transformedNode) */
    [set] void SetTransformedNode(es2panda_Context context, String transformationName, ir.AstNode transformedNode);

    /* virtual void Accept(ASTVisitorT *v) = 0 */
    void Accept(es2panda_Context context, es2panda_AstVisitor v);

    /* void SetOriginalNode(AstNode *originalNode) noexcept */
    void SetOriginalNode(es2panda_Context context, ir.AstNode originalNode);

    /* AstNode *OriginalNode() const noexcept */
    ir.AstNode OriginalNodeConst(es2panda_Context context);

    /* virtual void CleanUp() */
    void CleanUp(es2panda_Context context);

    /* AstNode *ShallowClone(ArenaAllocator *allocator) */
    ir.AstNode ShallowClone(es2panda_Context context);

    /* bool IsValidInCurrentPhase() const */
    boolean IsValidInCurrentPhaseConst(es2panda_Context context);

    /* AstNode *GetHistoryNode() const */
    ir.AstNode GetHistoryNodeConst(es2panda_Context context);

    /* AstNode *GetOrCreateHistoryNode() const */
    ir.AstNode GetOrCreateHistoryNodeConst(es2panda_Context context);

    /* virtual void CleanCheckInformation() */
    void CleanCheckInformation(es2panda_Context context);
};

[Entity=Class] interface Annotated {
};

[Entity=Class] interface VectorIterationGuard {
};

[Entity=Class, Es2pandaAstNodeType=152, c_type=es2panda_AstNode] interface UnaryExpression: Expression {

    /* explicit UnaryExpression(Expression *const argument, lexer::TokenType const unaryOperator) */
    static ir.UnaryExpression Create(es2panda_Context context, ir.Expression argument, Es2pandaTokenType unaryOperator);
    static ir.UnaryExpression Update(es2panda_Context context, ir.UnaryExpression original, ir.Expression argument, Es2pandaTokenType unaryOperator);

    /* [[nodiscard]] lexer::TokenType OperatorType() const noexcept */
    [get] Es2pandaTokenType OperatorTypeConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Argument() noexcept */
    [get] ir.Expression Argument(es2panda_Context context);

    /* [[nodiscard]] const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);

    /* void SetArgument(Expression *arg) */
    [set] void SetArgument(es2panda_Context context, ir.Expression arg);
};

[Entity=Class, Es2pandaAstNodeType=31, c_type=es2panda_AstNode] interface ForInStatement: LoopStatement {

    /* explicit ForInStatement(AstNode *left, Expression *right, Statement *body) */
    static ir.ForInStatement Create(es2panda_Context context, ir.AstNode left, ir.Expression right, ir.Statement body);
    static ir.ForInStatement Update(es2panda_Context context, ir.ForInStatement original, ir.AstNode left, ir.Expression right, ir.Statement body);

    /* AstNode *Left() */
    [get] ir.AstNode Left(es2panda_Context context);

    /* const AstNode *Left() const */
    [get] ir.AstNode LeftConst(es2panda_Context context);

    /* void SetLeft(AstNode *left) */
    [set] void SetLeft(es2panda_Context context, ir.AstNode left);

    /* Expression *Right() */
    [get] ir.Expression Right(es2panda_Context context);

    /* const Expression *Right() const */
    [get] ir.Expression RightConst(es2panda_Context context);

    /* void SetRight(Expression *right) */
    [set] void SetRight(es2panda_Context context, ir.Expression right);

    /* Statement *Body() */
    [get] ir.Statement Body(es2panda_Context context);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* void SetBody(Statement *body) */
    [set] void SetBody(es2panda_Context context, ir.Statement body);
};

[Entity=Class, Es2pandaAstNodeType=148, c_type=es2panda_AstNode] interface ThisExpression: Expression {

    /* explicit ThisExpression() */
    static ir.ThisExpression Create(es2panda_Context context);
    static ir.ThisExpression Update(es2panda_Context context, ir.ThisExpression original);
};

[Entity=Class, Es2pandaAstNodeType=110, c_type=es2panda_AstNode] interface TSMethodSignature: AstNode {

    /* explicit TSMethodSignature(Expression *key, ir::FunctionSignature &&signature, bool computed, bool optional) */
    static ir.TSMethodSignature Create(es2panda_Context context, ir.Expression key, ir.FunctionSignature signature, boolean computed, boolean optional_arg);
    static ir.TSMethodSignature Update(es2panda_Context context, ir.TSMethodSignature original, ir.Expression key, ir.FunctionSignature signature, boolean computed, boolean optional_arg);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* [[nodiscard]] const Expression *Key() const noexcept */
    [get] ir.Expression KeyConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Key() noexcept */
    [get] ir.Expression Key(es2panda_Context context);

    /* [[nodiscard]] const TSTypeParameterDeclaration *TypeParams() const noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &Params() const noexcept */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* [[nodiscard]] const TypeNode *ReturnTypeAnnotation() const noexcept */
    [get] ir.TypeNode ReturnTypeAnnotationConst(es2panda_Context context);

    /* TypeNode *ReturnTypeAnnotation() */
    [get] ir.TypeNode ReturnTypeAnnotation(es2panda_Context context);

    /* [[nodiscard]] bool Computed() const noexcept */
    [get] boolean ComputedConst(es2panda_Context context);

    /* [[nodiscard]] bool Optional() const noexcept */
    [get] boolean OptionalConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=6, c_type=es2panda_AstNode] interface BinaryExpression: Expression {

    /* explicit BinaryExpression(Expression *const left, Expression *const right, lexer::TokenType const operatorType) */
    static ir.BinaryExpression Create(es2panda_Context context, ir.Expression left, ir.Expression right, Es2pandaTokenType operatorType);
    static ir.BinaryExpression Update(es2panda_Context context, ir.BinaryExpression original, ir.Expression left, ir.Expression right, Es2pandaTokenType operatorType);

    /* [[nodiscard]] const Expression *Left() const noexcept */
    [get] ir.Expression LeftConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Left() noexcept */
    [get] ir.Expression Left(es2panda_Context context);

    /* [[nodiscard]] const Expression *Right() const noexcept */
    [get] ir.Expression RightConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Right() noexcept */
    [get] ir.Expression Right(es2panda_Context context);

    /* [[nodiscard]] const Expression *Result() const noexcept */
    [get] ir.Expression ResultConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Result() noexcept */
    [get] ir.Expression Result(es2panda_Context context);

    /* [[nodiscard]] lexer::TokenType OperatorType() const noexcept */
    [get] Es2pandaTokenType OperatorTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsLogical() const noexcept */
    [get] boolean IsLogicalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsLogicalExtended() const noexcept */
    [get] boolean IsLogicalExtendedConst(es2panda_Context context);

    /* [[nodiscard]] bool IsBitwise() const noexcept */
    [get] boolean IsBitwiseConst(es2panda_Context context);

    /* [[nodiscard]] bool IsArithmetic() const noexcept */
    [get] boolean IsArithmeticConst(es2panda_Context context);

    /* void SetLeft(Expression *expr) noexcept */
    [set] void SetLeft(es2panda_Context context, ir.Expression expr);

    /* void SetRight(Expression *expr) noexcept */
    [set] void SetRight(es2panda_Context context, ir.Expression expr);

    /* void SetResult(Expression *expr) noexcept */
    [set] void SetResult(es2panda_Context context, ir.Expression expr);

    /* void SetOperator(lexer::TokenType operatorType) noexcept */
    [set] void SetOperator(es2panda_Context context, Es2pandaTokenType operatorType);

    /* [[nodiscard]] checker::Type *OperationType() noexcept */
    [get] checker.Type OperationType(es2panda_Context context);

    /* void SetOperationType(checker::Type *const operationType) noexcept */
    [set] void SetOperationType(es2panda_Context context, checker.Type operationType);

    /* [[nodiscard]] const checker::Type *OperationType() const noexcept */
    [get] checker.Type OperationTypeConst(es2panda_Context context);

    /* void CompileOperands(compiler::ETSGen *etsg, compiler::VReg lhs) const */
    void CompileOperandsConst(es2panda_Context context, es2panda_CodeGen etsg, es2panda_VReg lhs);
};

[Entity=Class, Es2pandaAstNodeType=87, c_type=es2panda_AstNode] interface SuperExpression: Expression {

    /* explicit SuperExpression() */
    static ir.SuperExpression Create(es2panda_Context context);
    static ir.SuperExpression Update(es2panda_Context context, ir.SuperExpression original);
};

[Entity=Class, Es2pandaAstNodeType=3, c_type=es2panda_AstNode] interface AssertStatement: Statement {

    /* explicit AssertStatement([[maybe_unused]] Expression *test, [[maybe_unused]] Expression *second) */
    static ir.AssertStatement Create(es2panda_Context context, ir.Expression test, ir.Expression second);
    static ir.AssertStatement Update(es2panda_Context context, ir.AssertStatement original, ir.Expression test, ir.Expression second);

    /* const Expression *Test() const */
    ir.Expression TestConst(es2panda_Context context);

    /* Expression *Test() */
    ir.Expression Test(es2panda_Context context);

    /* const Expression *Second() const */
    ir.Expression SecondConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=96, c_type=es2panda_AstNode] interface TSStringKeyword: TypeNode {

    /* explicit TSStringKeyword(ArenaAllocator *const allocator) */
    static ir.TSStringKeyword Create(es2panda_Context context);
    static ir.TSStringKeyword Update(es2panda_Context context, ir.TSStringKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=163, c_type=es2panda_AstNode] interface AssignmentExpression: Expression {

    /* explicit AssignmentExpression(Expression *const left, Expression *const right,
                                  lexer::TokenType const assignmentOperator) */
    static ir.AssignmentExpression Create(es2panda_Context context, ir.Expression left, ir.Expression right, Es2pandaTokenType assignmentOperator);
    static ir.AssignmentExpression Update(es2panda_Context context, ir.AssignmentExpression original, ir.Expression left, ir.Expression right, Es2pandaTokenType assignmentOperator);

    /* explicit AssignmentExpression(AstNodeType const type, Expression *const left, Expression *const right,
                                  lexer::TokenType const assignmentOperator) */
    static ir.AssignmentExpression Create1(es2panda_Context context, Es2pandaAstNodeType type, ir.Expression left, ir.Expression right, Es2pandaTokenType assignmentOperator);
    static ir.AssignmentExpression Update1(es2panda_Context context, ir.AssignmentExpression original, Es2pandaAstNodeType type, ir.Expression left, ir.Expression right, Es2pandaTokenType assignmentOperator);

    /* [[nodiscard]] const Expression *Left() const noexcept */
    [get] ir.Expression LeftConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Left() noexcept */
    [get] ir.Expression Left(es2panda_Context context);

    /* [[nodiscard]] Expression *Right() noexcept */
    [get] ir.Expression Right(es2panda_Context context);

    /* [[nodiscard]] const Expression *Right() const noexcept */
    [get] ir.Expression RightConst(es2panda_Context context);

    /* void SetRight(Expression *const expr) noexcept */
    [set] void SetRight(es2panda_Context context, ir.Expression expr);

    /* void SetLeft(Expression *const expr) noexcept */
    [set] void SetLeft(es2panda_Context context, ir.Expression expr);

    /* [[nodiscard]] const Expression *Result() const noexcept */
    [get] ir.Expression ResultConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Result() noexcept */
    [get] ir.Expression Result(es2panda_Context context);

    /* [[nodiscard]] lexer::TokenType OperatorType() const noexcept */
    [get] Es2pandaTokenType OperatorTypeConst(es2panda_Context context);

    /* lexer::TokenType SetOperatorType(lexer::TokenType tokenType) noexcept */
    [get] Es2pandaTokenType SetOperatorType(es2panda_Context context, Es2pandaTokenType tokenType);

    /* void SetResult(Expression *expr) noexcept */
    [set] void SetResult(es2panda_Context context, ir.Expression expr);

    /* [[nodiscard]] bool IsLogicalExtended() const noexcept */
    [get] boolean IsLogicalExtendedConst(es2panda_Context context);

    /* [[nodiscard]] varbinder::Variable *Target() noexcept */
    [get] varbinder.Variable Target(es2panda_Context context);

    /* [[nodiscard]] varbinder::Variable *Target() const noexcept */
    [get] varbinder.Variable TargetConst(es2panda_Context context);

    /* void SetIgnoreConstAssign() */
    [set] void SetIgnoreConstAssign(es2panda_Context context);

    /* [[nodiscard]] bool IsIgnoreConstAssign() const */
    [get] boolean IsIgnoreConstAssignConst(es2panda_Context context);

    /* [[nodiscard]] bool ConvertibleToAssignmentPatternLeft(bool mustBePattern) */
    boolean ConvertibleToAssignmentPatternLeft(es2panda_Context context, boolean mustBePattern);

    /* [[nodiscard]] bool ConvertibleToAssignmentPatternRight() */
    boolean ConvertibleToAssignmentPatternRight(es2panda_Context context);

    /* [[nodiscard]] bool ConvertibleToAssignmentPattern(bool mustBePattern = true) */
    boolean ConvertibleToAssignmentPattern(es2panda_Context context, boolean mustBePattern);

    /* void CompilePattern(compiler::PandaGen *pg) const */
    void CompilePatternConst(es2panda_Context context, es2panda_CodeGen pg);
};

[Entity=Class, Es2pandaAstNodeType=30, c_type=es2panda_AstNode] interface ExpressionStatement: Statement {

    /* explicit ExpressionStatement(Expression *expr) */
    static ir.ExpressionStatement Create(es2panda_Context context, ir.Expression expr);
    static ir.ExpressionStatement Update(es2panda_Context context, ir.ExpressionStatement original, ir.Expression expr);

    /* const Expression *GetExpression() const */
    [get] ir.Expression GetExpressionConst(es2panda_Context context);

    /* Expression *GetExpression() */
    [get] ir.Expression GetExpression(es2panda_Context context);

    /* void SetExpression(Expression *expr) */
    [set] void SetExpression(es2panda_Context context, ir.Expression expr);
};

[Entity=Class, Es2pandaAstNodeType=86, c_type=es2panda_AstNode] interface ETSModule: BlockStatement {

    /* explicit ETSModule(ArenaAllocator *allocator, ArenaVector<Statement *> &&statementList, Identifier *ident,
                       ModuleFlag flag, Language lang, parser::Program *program) */
    static ir.ETSModule Create(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen, ir.Identifier ident, Es2pandaModuleFlag flag, parser.Program program);
    static ir.ETSModule Update(es2panda_Context context, ir.ETSModule original, sequence<ir.Statement> statementList, u32 statementListLen, ir.Identifier ident, Es2pandaModuleFlag flag, parser.Program program);

    /* explicit ETSModule(ArenaAllocator *allocator, ArenaVector<Statement *> &&statementList, Identifier *ident,
                       ModuleFlag flag, Language lang, parser::Program *program) */
    static ir.ETSModule Create1(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen, ir.Identifier ident, Es2pandaModuleFlag flag, Es2pandaLanguage lang, parser.Program program);
    static ir.ETSModule Update1(es2panda_Context context, ir.ETSModule original, sequence<ir.Statement> statementList, u32 statementListLen, ir.Identifier ident, Es2pandaModuleFlag flag, Es2pandaLanguage lang, parser.Program program);

    /* ir::Identifier *Ident() */
    [get] ir.Identifier Ident(es2panda_Context context);

    /* const ir::Identifier *Ident() const */
    [get] ir.Identifier IdentConst(es2panda_Context context);

    /* void SetIdent(ir::Identifier *ident) */
    [set] void SetIdent(es2panda_Context context, ir.Identifier ident);

    /* parser::Program *Program() */
    [get] parser.Program Program(es2panda_Context context);

    /* const ir::ClassDefinition *GlobalClass() const */
    [get] ir.ClassDefinition GlobalClassConst(es2panda_Context context);

    /* [[nodiscard]] es2panda::Language Language() const noexcept */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* ir::ClassDefinition *GlobalClass() */
    [get] ir.ClassDefinition GlobalClass(es2panda_Context context);

    /* void SetGlobalClass(ir::ClassDefinition *globalClass) */
    [set] void SetGlobalClass(es2panda_Context context, ir.ClassDefinition globalClass);

    /* [[nodiscard]] bool IsETSScript() const noexcept */
    [get] boolean IsETSScriptConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNamespace() const noexcept */
    [get] boolean IsNamespaceConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNamespaceChainLastNode() const noexcept */
    [get] boolean IsNamespaceChainLastNodeConst(es2panda_Context context);

    /* void SetNamespaceChainLastNode() noexcept */
    [set] void SetNamespaceChainLastNode(es2panda_Context context);

    /* const parser::Program *Program() const */
    [get] parser.Program ProgramConst(es2panda_Context context);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=46, c_type=es2panda_AstNode] interface MetaProperty: Expression {

    /* explicit MetaProperty(MetaPropertyKind const kind) */
    static ir.MetaProperty Create(es2panda_Context context, Es2pandaMetaPropertyKind kind);
    static ir.MetaProperty Update(es2panda_Context context, ir.MetaProperty original, Es2pandaMetaPropertyKind kind);

    /* [[nodiscard]] MetaPropertyKind Kind() const noexcept */
    [get] Es2pandaMetaPropertyKind KindConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=106, c_type=es2panda_AstNode] interface TSArrayType: TypeNode {

    /* explicit TSArrayType(TypeNode *elementType, ArenaAllocator *const allocator) */
    static ir.TSArrayType Create(es2panda_Context context, ir.TypeNode elementType);
    static ir.TSArrayType Update(es2panda_Context context, ir.TSArrayType original, ir.TypeNode elementType);

    /* const TypeNode *ElementType() const */
    [get] ir.TypeNode ElementTypeConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=111, c_type=es2panda_AstNode] interface TSSignatureDeclaration: TypedAstNode {

    /* explicit TSSignatureDeclaration(TSSignatureDeclarationKind const kind, FunctionSignature &&signature) */
    static ir.TSSignatureDeclaration Create(es2panda_Context context, Es2pandaTSSignatureDeclarationKind kind, ir.FunctionSignature signature);
    static ir.TSSignatureDeclaration Update(es2panda_Context context, ir.TSSignatureDeclaration original, Es2pandaTSSignatureDeclarationKind kind, ir.FunctionSignature signature);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* [[nodiscard]] const TSTypeParameterDeclaration *TypeParams() const noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] TSTypeParameterDeclaration *TypeParams() */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &Params() const noexcept */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* [[nodiscard]] const TypeNode *ReturnTypeAnnotation() const noexcept */
    [get] ir.TypeNode ReturnTypeAnnotationConst(es2panda_Context context);

    /* TypeNode *ReturnTypeAnnotation() noexcept */
    [get] ir.TypeNode ReturnTypeAnnotation(es2panda_Context context);

    /* [[nodiscard]] TSSignatureDeclarationKind Kind() const noexcept */
    [get] Es2pandaTSSignatureDeclarationKind KindConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=26, c_type=es2panda_AstNode] interface ExportAllDeclaration: Statement {

    /* explicit ExportAllDeclaration(StringLiteral *source, Identifier *exported) */
    static ir.ExportAllDeclaration Create(es2panda_Context context, ir.StringLiteral source, ir.Identifier exported);
    static ir.ExportAllDeclaration Update(es2panda_Context context, ir.ExportAllDeclaration original, ir.StringLiteral source, ir.Identifier exported);

    /* const StringLiteral *Source() const */
    [get] ir.StringLiteral SourceConst(es2panda_Context context);

    /* const Identifier *Exported() const */
    [get] ir.Identifier ExportedConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=29, c_type=es2panda_AstNode] interface ExportSpecifier: Statement {

    /* explicit ExportSpecifier(Identifier *local, Identifier *exported) */
    static ir.ExportSpecifier Create(es2panda_Context context, ir.Identifier local, ir.Identifier exported);
    static ir.ExportSpecifier Update(es2panda_Context context, ir.ExportSpecifier original, ir.Identifier local, ir.Identifier exported);

    /* const Identifier *Local() const */
    [get] ir.Identifier LocalConst(es2panda_Context context);

    /* const Identifier *Exported() const */
    [get] ir.Identifier ExportedConst(es2panda_Context context);

    /* void SetDefault() */
    [set] void SetDefault(es2panda_Context context);

    /* bool IsDefault() const */
    [get] boolean IsDefaultConst(es2panda_Context context);

    /* void SetConstantExpression(ir::Expression *constantExpression) */
    [set] void SetConstantExpression(es2panda_Context context, ir.Expression constantExpression);

    /* ir::Expression *GetConstantExpression() const */
    [get] ir.Expression GetConstantExpressionConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDefaultExport() const noexcept */
    [get] boolean IsDefaultExportConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=138, c_type=es2panda_AstNode] interface TSTupleType: TypeNode {

    /* explicit TSTupleType(ArenaVector<TypeNode *> &&elementTypes, ArenaAllocator *const allocator) */
    static ir.TSTupleType Create(es2panda_Context context, sequence<ir.TypeNode> elementTypes, u32 elementTypesLen);
    static ir.TSTupleType Update(es2panda_Context context, ir.TSTupleType original, sequence<ir.TypeNode> elementTypes, u32 elementTypesLen);

    /* const ArenaVector<TypeNode *> &ElementType() const */
    [get] sequence<ir.TypeNode> ElementTypeConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=35, c_type=es2panda_AstNode] interface FunctionExpression: Expression {

    /* explicit FunctionExpression(ScriptFunction *const func) */
    static ir.FunctionExpression Create(es2panda_Context context, ir.ScriptFunction func);
    static ir.FunctionExpression Update(es2panda_Context context, ir.FunctionExpression original, ir.ScriptFunction func);

    /* explicit FunctionExpression(ir::Identifier *namedExpr, ScriptFunction *const func) */
    static ir.FunctionExpression Create1(es2panda_Context context, ir.Identifier namedExpr, ir.ScriptFunction func);
    static ir.FunctionExpression Update1(es2panda_Context context, ir.FunctionExpression original, ir.Identifier namedExpr, ir.ScriptFunction func);

    /* [[nodiscard]] const ScriptFunction *Function() const noexcept */
    [get] ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* [[nodiscard]] ScriptFunction *Function() noexcept */
    [get] ir.ScriptFunction Function(es2panda_Context context);

    /* void SetFunction(ScriptFunction *func) */
    [set] void SetFunction(es2panda_Context context, ir.ScriptFunction func);

    /* bool IsAnonymous() const */
    [get] boolean IsAnonymousConst(es2panda_Context context);

    /* ir::Identifier *Id() */
    [get] ir.Identifier Id(es2panda_Context context);

    /* void SetId(ir::Identifier *id) */
    [set] void SetId(es2panda_Context context, ir.Identifier id);
};

[Entity=Class, Es2pandaAstNodeType=140, c_type=es2panda_AstNode] interface TSIndexSignature: TypedAstNode {

    /* explicit TSIndexSignature(Expression *const param, TypeNode *const typeAnnotation, bool const readonly) */
    static ir.TSIndexSignature Create(es2panda_Context context, ir.Expression param, ir.TypeNode typeAnnotation, boolean readonly_arg);
    static ir.TSIndexSignature Update(es2panda_Context context, ir.TSIndexSignature original, ir.Expression param, ir.TypeNode typeAnnotation, boolean readonly_arg);

    /* [[nodiscard]] const Expression *Param() const noexcept */
    [get] ir.Expression ParamConst(es2panda_Context context);

    /* [[nodiscard]] const TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* [[nodiscard]] bool Readonly() const noexcept */
    [get] boolean ReadonlyConst(es2panda_Context context);

    /* [[nodiscard]] TSIndexSignatureKind Kind() const noexcept */
    Es2pandaTSIndexSignatureKind KindConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=127, c_type=es2panda_AstNode] interface TSModuleDeclaration: Statement {

    /* explicit TSModuleDeclaration([[maybe_unused]] ArenaAllocator *allocator, Expression *name, Statement *body,
                                 ConstructorFlags &&flags) */
    static ir.TSModuleDeclaration Create(es2panda_Context context, ir.Expression name, ir.Statement body, boolean declare, boolean global);
    static ir.TSModuleDeclaration Update(es2panda_Context context, ir.TSModuleDeclaration original, ir.Expression name, ir.Statement body, boolean declare, boolean global);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* const Expression *Name() const */
    [get] ir.Expression NameConst(es2panda_Context context);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* bool Global() const */
    [get] boolean GlobalConst(es2panda_Context context);

    /* bool IsExternalOrAmbient() const */
    [get] boolean IsExternalOrAmbientConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=39, c_type=es2panda_AstNode] interface ImportDeclaration: Statement {

    /* explicit ImportDeclaration(StringLiteral *source, ArenaVector<AstNode *> &&specifiers,
                               const ImportKinds importKinds = ImportKinds::ALL) */
    static ir.ImportDeclaration Create(es2panda_Context context, ir.StringLiteral source, sequence<ir.AstNode> specifiers, u32 specifiersLen, Es2pandaImportKinds importKinds);
    static ir.ImportDeclaration Update(es2panda_Context context, ir.ImportDeclaration original, ir.StringLiteral source, sequence<ir.AstNode> specifiers, u32 specifiersLen, Es2pandaImportKinds importKinds);

    /* void EmplaceSpecifiers(AstNode *source) */
    void EmplaceSpecifiers(es2panda_Context context, ir.AstNode source);

    /* void ClearSpecifiers() */
    void ClearSpecifiers(es2panda_Context context);

    /* void SetValueSpecifiers(AstNode *source, size_t index) */
    [set] void SetValueSpecifiers(es2panda_Context context, ir.AstNode source, u32 index);

    /* [[nodiscard]] ArenaVector<AstNode *> &SpecifiersForUpdate() */
    sequence<ir.AstNode> SpecifiersForUpdate(es2panda_Context context);

    /* const StringLiteral *Source() const */
    [get] ir.StringLiteral SourceConst(es2panda_Context context);

    /* StringLiteral *Source() */
    [get] ir.StringLiteral Source(es2panda_Context context);

    /* void SetSource(StringLiteral *source) */
    [set] void SetSource(es2panda_Context context, ir.StringLiteral source);

    /* const ArenaVector<AstNode *> &Specifiers() const */
    [get] sequence<ir.AstNode> SpecifiersConst(es2panda_Context context);

    /* void SetSpecifiers(ArenaVector<AstNode *> &&specifiersList) */
    [set] void SetSpecifiers(es2panda_Context context, sequence<ir.AstNode> specifiersList, u32 specifiersListLen);

    /* bool IsTypeKind() const */
    [get] boolean IsTypeKindConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=112, c_type=es2panda_AstNode] interface TSParenthesizedType: TypeNode {

    /* explicit TSParenthesizedType(TypeNode *type, ArenaAllocator *const allocator) */
    static ir.TSParenthesizedType Create(es2panda_Context context, ir.TypeNode type);
    static ir.TSParenthesizedType Update(es2panda_Context context, ir.TSParenthesizedType original, ir.TypeNode type);

    /* const Expression *Type() const */
    [get] ir.Expression TypeConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface Literal: Expression {

    /* [[nodiscard]] bool IsFolded() const noexcept */
    [get] boolean IsFoldedConst(es2panda_Context context);

    /* void SetFolded(bool folded = true) noexcept */
    [set] void SetFolded(es2panda_Context context, boolean folded);
};

[Entity=Class, Es2pandaAstNodeType=13, c_type=es2panda_AstNode] interface CharLiteral: Literal {

    /* explicit CharLiteral() */
    static ir.CharLiteral Create(es2panda_Context context);
    static ir.CharLiteral Update(es2panda_Context context, ir.CharLiteral original);

    /* explicit CharLiteral(char16_t const character) */
    static ir.CharLiteral Create1(es2panda_Context context, i16 character);
    static ir.CharLiteral Update1(es2panda_Context context, ir.CharLiteral original, i16 character);

    /* [[nodiscard]] char16_t Char() const noexcept */
    [get] i16 CharConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=68, c_type=es2panda_AstNode] interface ETSIntrinsicNode: Expression {

    /* explicit ETSIntrinsicNode(ETSIntrinsicNode const &other, ArenaAllocator *const allocator) */
    static ir.ETSIntrinsicNode Create(es2panda_Context context, ir.ETSIntrinsicNode other);
    static ir.ETSIntrinsicNode Update(es2panda_Context context, ir.ETSIntrinsicNode original, ir.ETSIntrinsicNode other);

    /* explicit ETSIntrinsicNode(util::StringView id, ArenaVector<ir::Expression *> &&arguments) */
    static ir.ETSIntrinsicNode Create1(es2panda_Context context, String id, sequence<ir.Expression> arguments, u32 argumentsLen);
    static ir.ETSIntrinsicNode Update1(es2panda_Context context, ir.ETSIntrinsicNode original, String id, sequence<ir.Expression> arguments, u32 argumentsLen);

    /* util::StringView Id() const */
    String IdConst(es2panda_Context context);

    /* checker::Type *ExpectedTypeAt(checker::ETSChecker *checker, size_t idx) const */
    checker.Type ExpectedTypeAtConst(es2panda_Context context, u32 idx);

    /* ArenaVector<ir::Expression *> const &Arguments() const */
    [get] sequence<ir.Expression> ArgumentsConst(es2panda_Context context);

    /* ArenaVector<ir::Expression *> &Arguments() */
    [get] sequence<ir.Expression> Arguments(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=73, c_type=es2panda_AstNode] interface ETSPackageDeclaration: Statement {

    /* explicit ETSPackageDeclaration(ir::Expression *const name) */
    static ir.ETSPackageDeclaration Create(es2panda_Context context, ir.Expression name);
    static ir.ETSPackageDeclaration Update(es2panda_Context context, ir.ETSPackageDeclaration original, ir.Expression name);

    /* const ir::Expression *Name() const */
    [get] ir.Expression NameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=71, c_type=es2panda_AstNode] interface ETSGenericInstantiatedNode: Expression {

    /* explicit ETSGenericInstantiatedNode(Expression *expression, TSTypeParameterInstantiation *typeParams) */
    static ir.ETSGenericInstantiatedNode Create(es2panda_Context context, ir.Expression expression, ir.TSTypeParameterInstantiation typeParams);
    static ir.ETSGenericInstantiatedNode Update(es2panda_Context context, ir.ETSGenericInstantiatedNode original, ir.Expression expression, ir.TSTypeParameterInstantiation typeParams);

    /* TSTypeParameterInstantiation *TypeParams() */
    [get] ir.TSTypeParameterInstantiation TypeParams(es2panda_Context context);

    /* Expression *GetExpression() */
    [get] ir.Expression GetExpression(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=83, c_type=es2panda_AstNode] interface ETSImportDeclaration: ImportDeclaration {

    /* ETSImportDeclaration(ir::StringLiteral *importPath, ArenaVector<AstNode *> &&specifiers,
                         const ImportKinds importKinds = ImportKinds::ALL) */
    static ir.ETSImportDeclaration Create(es2panda_Context context, ir.StringLiteral importPath, sequence<ir.AstNode> specifiers, u32 specifiersLen, Es2pandaImportKinds importKinds);
    static ir.ETSImportDeclaration Update(es2panda_Context context, ir.ETSImportDeclaration original, ir.StringLiteral importPath, sequence<ir.AstNode> specifiers, u32 specifiersLen, Es2pandaImportKinds importKinds);

    /* void CopyImportMetadataFrom(ETSImportDeclaration *other) */
    void CopyImportMetadataFrom(es2panda_Context context, ir.ETSImportDeclaration other);

    /* es2panda::Language Language() const */
    [get] Es2pandaLanguage LanguageConst(es2panda_Context context);

    /* std::string_view DeclPath() const */
    [get] String DeclPathConst(es2panda_Context context);

    /* std::string_view OhmUrl() const */
    [get] String OhmUrlConst(es2panda_Context context);

    /* bool IsValid() const */
    [get] boolean IsValidConst(es2panda_Context context);

    /* bool IsPureDynamic() const */
    [get] boolean IsPureDynamicConst(es2panda_Context context);

    /* void SetAssemblerName(util::StringView assemblerName) */
    [set] void SetAssemblerName(es2panda_Context context, String assemblerName);

    /* const util::StringView &AssemblerName() const */
    [get] String AssemblerNameConst(es2panda_Context context);

    /* std::string_view ResolvedSource() const */
    [get] String ResolvedSourceConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=88, c_type=es2panda_AstNode] interface ETSStructDeclaration: ClassDeclaration {

    /* explicit ETSStructDeclaration(ClassDefinition *const def, ArenaAllocator *const allocator) */
    static ir.ETSStructDeclaration Create(es2panda_Context context, ir.ClassDefinition def);
    static ir.ETSStructDeclaration Update(es2panda_Context context, ir.ETSStructDeclaration original, ir.ClassDefinition def);
};

[Entity=Class, Es2pandaAstNodeType=119, c_type=es2panda_AstNode] interface TSModuleBlock: Statement {

    /* explicit TSModuleBlock(ArenaVector<Statement *> &&statements) */
    static ir.TSModuleBlock Create(es2panda_Context context, sequence<ir.Statement> statements, u32 statementsLen);
    static ir.TSModuleBlock Update(es2panda_Context context, ir.TSModuleBlock original, sequence<ir.Statement> statements, u32 statementsLen);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* const ArenaVector<Statement *> &Statements() const */
    [get] sequence<ir.Statement> StatementsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=80, c_type=es2panda_AstNode] interface ETSNewArrayInstanceExpression: Expression {

    /* explicit ETSNewArrayInstanceExpression(ir::TypeNode *const typeReference, ir::Expression *const dimension) */
    static ir.ETSNewArrayInstanceExpression Create(es2panda_Context context, ir.TypeNode typeReference, ir.Expression dimension);
    static ir.ETSNewArrayInstanceExpression Update(es2panda_Context context, ir.ETSNewArrayInstanceExpression original, ir.TypeNode typeReference, ir.Expression dimension);

    /* [[nodiscard]] ir::TypeNode *TypeReference() noexcept */
    [get] ir.TypeNode TypeReference(es2panda_Context context);

    /* [[nodiscard]] ir::TypeNode const *TypeReference() const noexcept */
    [get] ir.TypeNode TypeReferenceConst(es2panda_Context context);

    /* [[nodiscard]] ir::Expression *Dimension() noexcept */
    [get] ir.Expression Dimension(es2panda_Context context);

    /* [[nodiscard]] ir::Expression const *Dimension() const noexcept */
    [get] ir.Expression DimensionConst(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() const noexcept */
    [get] checker.Signature SignatureConst(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() noexcept */
    [get] checker.Signature Signature(es2panda_Context context);

    /* void SetDimension(ir::Expression *dimension) noexcept */
    [set] void SetDimension(es2panda_Context context, ir.Expression dimension);

    /* void SetSignature(checker::Signature *signature) noexcept */
    [set] void SetSignature(es2panda_Context context, checker.Signature signature);

    /* void SetPreferredTypeBasedOnFuncParam(checker::ETSChecker *checker, checker::Type *param,
                                          checker::TypeRelationFlag flags) */
    [set] void SetPreferredTypeBasedOnFuncParam(es2panda_Context context, checker.Type param, Es2pandaTypeRelationFlag flags);

    /* void ClearPreferredType() */
    void ClearPreferredType(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface LoopStatement: Statement {

    /* [[nodiscard]] varbinder::LoopScope *Scope() const noexcept final */
    [get] varbinder.LoopScope ScopeConst(es2panda_Context context);

    /* void SetScope(varbinder::LoopScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LoopScope scope);
};

[Entity=Class, Es2pandaAstNodeType=1, c_type=es2panda_AstNode] interface AnnotationDeclaration: Statement {

    /* explicit AnnotationDeclaration(Expression *expr, ArenaAllocator *allocator) */
    static ir.AnnotationDeclaration Create(es2panda_Context context, ir.Expression expr);
    static ir.AnnotationDeclaration Update(es2panda_Context context, ir.AnnotationDeclaration original, ir.Expression expr);

    /* explicit AnnotationDeclaration(Expression *expr, ArenaVector<AstNode *> &&properties, ArenaAllocator *allocator) */
    static ir.AnnotationDeclaration Create1(es2panda_Context context, ir.Expression expr, sequence<ir.AstNode> properties, u32 propertiesLen);
    static ir.AnnotationDeclaration Update1(es2panda_Context context, ir.AnnotationDeclaration original, ir.Expression expr, sequence<ir.AstNode> properties, u32 propertiesLen);

    /* const util::StringView &InternalName() const */
    [get] String InternalNameConst(es2panda_Context context);

    /* void SetInternalName(util::StringView internalName) */
    [set] void SetInternalName(es2panda_Context context, String internalName);

    /* [[nodiscard]] const Expression *Expr() const noexcept */
    [get] ir.Expression ExprConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Expr() noexcept */
    [get] ir.Expression Expr(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<AstNode *> &Properties() */
    sequence<ir.AstNode> Properties(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<AstNode *> &PropertiesForUpdate() */
    sequence<ir.AstNode> PropertiesForUpdate(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<AstNode *> &Properties() const noexcept */
    [get] sequence<ir.AstNode> PropertiesConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<AstNode *> *PropertiesPtr() const */
    [get] sequence<ir.AstNode> PropertiesPtrConst(es2panda_Context context);

    /* void AddProperties(ArenaVector<AstNode *> &&properties) */
    [set] void AddProperties(es2panda_Context context, sequence<ir.AstNode> properties, u32 propertiesLen);

    /* [[nodiscard]] bool IsSourceRetention() const noexcept */
    [get] boolean IsSourceRetentionConst(es2panda_Context context);

    /* [[nodiscard]] bool IsBytecodeRetention() const noexcept */
    [get] boolean IsBytecodeRetentionConst(es2panda_Context context);

    /* [[nodiscard]] bool IsRuntimeRetention() const noexcept */
    [get] boolean IsRuntimeRetentionConst(es2panda_Context context);

    /* void SetSourceRetention() noexcept */
    [set] void SetSourceRetention(es2panda_Context context);

    /* void SetBytecodeRetention() noexcept */
    [set] void SetBytecodeRetention(es2panda_Context context);

    /* void SetRuntimeRetention() noexcept */
    [set] void SetRuntimeRetention(es2panda_Context context);

    /* void SetScope(varbinder::LocalScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);

    /* Identifier *GetBaseName() const */
    ir.Identifier GetBaseNameConst(es2panda_Context context);

    /* void EmplaceProperties(AstNode *properties) */
    void EmplaceProperties(es2panda_Context context, ir.AstNode properties);

    /* void ClearProperties() */
    void ClearProperties(es2panda_Context context);

    /* void SetValueProperties(AstNode *properties, size_t index) */
    [set] void SetValueProperties(es2panda_Context context, ir.AstNode properties, u32 index);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=2, c_type=es2panda_AstNode] interface AnnotationUsage: Statement {

    /* explicit AnnotationUsage(Expression *expr, ArenaAllocator *allocator) */
    static ir.AnnotationUsage Create(es2panda_Context context, ir.Expression expr);
    static ir.AnnotationUsage Update(es2panda_Context context, ir.AnnotationUsage original, ir.Expression expr);

    /* explicit AnnotationUsage(Expression *expr, ArenaVector<AstNode *> &&properties) */
    static ir.AnnotationUsage Create1(es2panda_Context context, ir.Expression expr, sequence<ir.AstNode> properties, u32 propertiesLen);
    static ir.AnnotationUsage Update1(es2panda_Context context, ir.AnnotationUsage original, ir.Expression expr, sequence<ir.AstNode> properties, u32 propertiesLen);

    /* [[nodiscard]] Expression *Expr() noexcept */
    [get] ir.Expression Expr(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<AstNode *> &Properties() noexcept */
    [get] sequence<ir.AstNode> Properties(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<AstNode *> &Properties() const noexcept */
    [get] sequence<ir.AstNode> PropertiesConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<AstNode *> *PropertiesPtr() const */
    [get] sequence<ir.AstNode> PropertiesPtrConst(es2panda_Context context);

    /* void AddProperty(AstNode *property) */
    [set] void AddProperty(es2panda_Context context, ir.AstNode property);

    /* void SetProperties(ArenaVector<AstNode *> &&properties) */
    [set] void SetProperties(es2panda_Context context, sequence<ir.AstNode> properties, u32 propertiesLen);

    /* void SetScope(varbinder::AnnotationParamScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.AnnotationParamScope scope);

    /* Identifier *GetBaseName() const */
    ir.Identifier GetBaseNameConst(es2panda_Context context);

    /* void SetHasParameterParen(bool v) */
    [set] void SetHasParameterParen(es2panda_Context context, boolean v);

    /* bool HasParameterParen() const */
    [get] boolean HasParameterParenConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=25, c_type=es2panda_AstNode] interface EmptyStatement: Statement {

    /* explicit EmptyStatement() */
    static ir.EmptyStatement Create(es2panda_Context context);
    static ir.EmptyStatement Update(es2panda_Context context, ir.EmptyStatement original);

    /* explicit EmptyStatement(bool isBrokenStatement) */
    static ir.EmptyStatement Create1(es2panda_Context context, boolean isBrokenStatement);
    static ir.EmptyStatement Update1(es2panda_Context context, ir.EmptyStatement original, boolean isBrokenStatement);

    /* bool IsBrokenStatement() */
    boolean IsBrokenStatement(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=156, c_type=es2panda_AstNode] interface WhileStatement: LoopStatement {

    /* explicit WhileStatement(Expression *test, Statement *body) */
    static ir.WhileStatement Create(es2panda_Context context, ir.Expression test, ir.Statement body);
    static ir.WhileStatement Update(es2panda_Context context, ir.WhileStatement original, ir.Expression test, ir.Statement body);

    /* const Expression *Test() const */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* Expression *Test() */
    [get] ir.Expression Test(es2panda_Context context);

    /* void SetTest(Expression *test) */
    [set] void SetTest(es2panda_Context context, ir.Expression test);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* Statement *Body() */
    [get] ir.Statement Body(es2panda_Context context);

    /* void SetBody(Statement *body) */
    [set] void SetBody(es2panda_Context context, ir.Statement body);
};

[Entity=Class, c_type=es2panda_FunctionSignature] interface FunctionSignature {

    /* explicit FunctionSignature(TSTypeParameterDeclaration *typeParams, ArenaVector<ir::Expression *> &&params,
                               TypeNode *returnTypeAnnotation, bool hasReceiver = false) */
    static ir.FunctionSignature Create(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams, sequence<ir.Expression> params, u32 paramsLen, ir.TypeNode returnTypeAnnotation, boolean hasReceiver);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &Params() const noexcept */
    [get] sequence<ir.Expression> ParamsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::Expression *> &Params() noexcept */
    [get] sequence<ir.Expression> Params(es2panda_Context context);

    /* [[nodiscard]] TSTypeParameterDeclaration *TypeParams() noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParams(es2panda_Context context);

    /* [[nodiscard]] const TSTypeParameterDeclaration *TypeParams() const noexcept */
    [get] ir.TSTypeParameterDeclaration TypeParamsConst(es2panda_Context context);

    /* void SetTypeParams(TSTypeParameterDeclaration *typeParams) noexcept */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterDeclaration typeParams);

    /* [[nodiscard]] TypeNode *ReturnType() noexcept */
    [get] ir.TypeNode ReturnType(es2panda_Context context);

    /* void SetReturnType(TypeNode *type) noexcept */
    [get] void SetReturnType(es2panda_Context context, ir.TypeNode type);

    /* [[nodiscard]] const TypeNode *ReturnType() const noexcept */
    [get] ir.TypeNode ReturnTypeConst(es2panda_Context context);

    /* void Iterate(const NodeTraverser &cb) const */
    void IterateConst(es2panda_Context context, NodeTraverser cb);

    /* void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) */
    void TransformChildren(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* [[nodiscard]] FunctionSignature Clone(ArenaAllocator *allocator) */
    ir.FunctionSignature Clone(es2panda_Context context);

    /* [[nodiscard]] bool HasReceiver() const noexcept */
    [get] boolean HasReceiverConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=12, c_type=es2panda_AstNode] interface ChainExpression: Expression {

    /* explicit ChainExpression(Expression *expression) */
    static ir.ChainExpression Create(es2panda_Context context, ir.Expression expression);
    static ir.ChainExpression Update(es2panda_Context context, ir.ChainExpression original, ir.Expression expression);

    /* const Expression *GetExpression() const noexcept */
    [get] ir.Expression GetExpressionConst(es2panda_Context context);

    /* Expression *GetExpression() noexcept */
    [get] ir.Expression GetExpression(es2panda_Context context);

    /* void SetExpression(Expression *expression) */
    [set] void SetExpression(es2panda_Context context, ir.Expression expression);

    /* void CompileToReg(compiler::PandaGen *pg, compiler::VReg &objReg) const */
    void CompileToRegConst(es2panda_Context context, es2panda_CodeGen pg, es2panda_VReg objReg);
};

[Entity=Class, Es2pandaAstNodeType=117, c_type=es2panda_AstNode] interface TSIntersectionType: TypeNode {

    /* explicit TSIntersectionType(ArenaVector<Expression *> &&types, ArenaAllocator *const allocator) */
    static ir.TSIntersectionType Create(es2panda_Context context, sequence<ir.Expression> types, u32 typesLen);
    static ir.TSIntersectionType Update(es2panda_Context context, ir.TSIntersectionType original, sequence<ir.Expression> types, u32 typesLen);

    /* const ArenaVector<Expression *> &Types() const */
    [get] sequence<ir.Expression> TypesConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=153, c_type=es2panda_AstNode] interface UpdateExpression: Expression {

    /* explicit UpdateExpression(Expression *const argument, lexer::TokenType const updateOperator, bool const isPrefix) */
    static ir.UpdateExpression Create(es2panda_Context context, ir.Expression argument, Es2pandaTokenType updateOperator, boolean isPrefix);
    static ir.UpdateExpression Update(es2panda_Context context, ir.UpdateExpression original, ir.Expression argument, Es2pandaTokenType updateOperator, boolean isPrefix);

    /* [[nodiscard]] lexer::TokenType OperatorType() const noexcept */
    [get] Es2pandaTokenType OperatorTypeConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Argument() noexcept */
    [get] ir.Expression Argument(es2panda_Context context);

    /* [[nodiscard]] const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);

    /* void SetArgument(Expression *argument) */
    [set] void SetArgument(es2panda_Context context, ir.Expression argument);

    /* [[nodiscard]] bool IsPrefix() const noexcept */
    [get] boolean IsPrefixConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=159, c_type=es2panda_AstNode] interface BlockExpression: Expression {

    /* explicit BlockExpression(ArenaVector<ir::Statement *> &&statements) */
    static ir.BlockExpression Create(es2panda_Context context, sequence<ir.Statement> statements, u32 statementsLen);
    static ir.BlockExpression Update(es2panda_Context context, ir.BlockExpression original, sequence<ir.Statement> statements, u32 statementsLen);

    /* [[nodiscard]] ArenaVector<ir::Statement *> const &Statements() const noexcept */
    [get] sequence<ir.Statement> StatementsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::Statement *> &Statements() noexcept */
    [get] sequence<ir.Statement> Statements(es2panda_Context context);

    /* void SetStatements(ArenaVector<Statement *> &&statementList) */
    [set] void SetStatements(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen);

    /* void AddStatements(ArenaVector<ir::Statement *> const &statements) */
    [set] void AddStatements(es2panda_Context context, sequence<ir.Statement> statements, u32 statementsLen);

    /* void AddStatement(ir::Statement *statement) */
    [set] void AddStatement(es2panda_Context context, ir.Statement statement);

    /* void SetScope(varbinder::Scope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);
};

[Entity=Class, Es2pandaAstNodeType=108, c_type=es2panda_AstNode] interface TSTypeLiteral: TypeNode {

    /* explicit TSTypeLiteral(ArenaVector<AstNode *> &&members, ArenaAllocator *const allocator) */
    static ir.TSTypeLiteral Create(es2panda_Context context, sequence<ir.AstNode> members, u32 membersLen);
    static ir.TSTypeLiteral Update(es2panda_Context context, ir.TSTypeLiteral original, sequence<ir.AstNode> members, u32 membersLen);

    /* const ArenaVector<AstNode *> &Members() const */
    [get] sequence<ir.AstNode> MembersConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=122, c_type=es2panda_AstNode] interface TSTypeParameter: Expression {

    /* explicit TSTypeParameter(Identifier *name, TypeNode *constraint, TypeNode *defaultType,
                             ArenaAllocator *const allocator) */
    static ir.TSTypeParameter Create(es2panda_Context context, ir.Identifier name, ir.TypeNode constraint, ir.TypeNode defaultType);
    static ir.TSTypeParameter Update(es2panda_Context context, ir.TSTypeParameter original, ir.Identifier name, ir.TypeNode constraint, ir.TypeNode defaultType);

    /* explicit TSTypeParameter(Identifier *name, TypeNode *constraint, TypeNode *defaultType, ModifierFlags flags,
                             ArenaAllocator *const allocator) */
    static ir.TSTypeParameter Create1(es2panda_Context context, ir.Identifier name, ir.TypeNode constraint, ir.TypeNode defaultType, Es2pandaModifierFlags flags);
    static ir.TSTypeParameter Update1(es2panda_Context context, ir.TSTypeParameter original, ir.Identifier name, ir.TypeNode constraint, ir.TypeNode defaultType, Es2pandaModifierFlags flags);

    /* const Identifier *Name() const */
    [get] ir.Identifier NameConst(es2panda_Context context);

    /* Identifier *Name() */
    [get] ir.Identifier Name(es2panda_Context context);

    /* TypeNode *Constraint() */
    [get] ir.TypeNode Constraint(es2panda_Context context);

    /* const TypeNode *Constraint() const */
    [get] ir.TypeNode ConstraintConst(es2panda_Context context);

    /* void SetConstraint(TypeNode *constraint) */
    [set] void SetConstraint(es2panda_Context context, ir.TypeNode constraint);

    /* TypeNode *DefaultType() const */
    [get] ir.TypeNode DefaultTypeConst(es2panda_Context context);

    /* void SetDefaultType(TypeNode *defaultType) */
    [set] void SetDefaultType(es2panda_Context context, ir.TypeNode defaultType);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=97, c_type=es2panda_AstNode] interface TSBooleanKeyword: TypeNode {

    /* explicit TSBooleanKeyword(ArenaAllocator *const allocator) */
    static ir.TSBooleanKeyword Create(es2panda_Context context);
    static ir.TSBooleanKeyword Update(es2panda_Context context, ir.TSBooleanKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=167, c_type=es2panda_AstNode] interface SpreadElement: AnnotatedExpression {

    /* explicit SpreadElement(AstNodeType const nodeType, [[maybe_unused]] ArenaAllocator *const allocator,
                           Expression *const argument) */
    static ir.SpreadElement Create(es2panda_Context context, Es2pandaAstNodeType nodeType, ir.Expression argument);
    static ir.SpreadElement Update(es2panda_Context context, ir.SpreadElement original, Es2pandaAstNodeType nodeType, ir.Expression argument);

    /* [[nodiscard]] const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Argument() noexcept */
    [get] ir.Expression Argument(es2panda_Context context);

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* void SetOptional(bool optional) noexcept */
    [set] void SetOptional(es2panda_Context context, boolean optional_arg);

    /* [[nodiscard]] bool ConvertibleToRest(bool isDeclaration, bool allowPattern = true) */
    boolean ConvertibleToRest(es2panda_Context context, boolean isDeclaration, boolean allowPattern);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=125, c_type=es2panda_AstNode] interface TSTypePredicate: TypeNode {

    /* explicit TSTypePredicate(Expression *parameterName, TypeNode *typeAnnotation, bool asserts,
                             ArenaAllocator *const allocator) */
    static ir.TSTypePredicate Create(es2panda_Context context, ir.Expression parameterName, ir.TypeNode typeAnnotation, boolean asserts);
    static ir.TSTypePredicate Update(es2panda_Context context, ir.TSTypePredicate original, ir.Expression parameterName, ir.TypeNode typeAnnotation, boolean asserts);

    /* Expression *ParameterName() const */
    [get] ir.Expression ParameterNameConst(es2panda_Context context);

    /* TypeNode *TypeAnnotation() const */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* bool Asserts() const */
    [get] boolean AssertsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=42, c_type=es2panda_AstNode] interface ImportNamespaceSpecifier: Statement {

    /* explicit ImportNamespaceSpecifier(Identifier *local) */
    static ir.ImportNamespaceSpecifier Create(es2panda_Context context, ir.Identifier local);
    static ir.ImportNamespaceSpecifier Update(es2panda_Context context, ir.ImportNamespaceSpecifier original, ir.Identifier local);

    /* Identifier *Local() */
    [get] ir.Identifier Local(es2panda_Context context);

    /* const Identifier *Local() const */
    [get] ir.Identifier LocalConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=28, c_type=es2panda_AstNode] interface ExportNamedDeclaration: Statement {

    /* explicit ExportNamedDeclaration([[maybe_unused]] ArenaAllocator *allocator, StringLiteral *source,
                                    ArenaVector<ExportSpecifier *> &&specifiers) */
    static ir.ExportNamedDeclaration Create(es2panda_Context context, ir.StringLiteral source, sequence<ir.ExportSpecifier> specifiers, u32 specifiersLen);
    static ir.ExportNamedDeclaration Update(es2panda_Context context, ir.ExportNamedDeclaration original, ir.StringLiteral source, sequence<ir.ExportSpecifier> specifiers, u32 specifiersLen);

    /* explicit ExportNamedDeclaration([[maybe_unused]] ArenaAllocator *allocator, AstNode *decl,
                                    ArenaVector<ExportSpecifier *> &&specifiers) */
    static ir.ExportNamedDeclaration Create1(es2panda_Context context, ir.AstNode decl, sequence<ir.ExportSpecifier> specifiers, u32 specifiersLen);
    static ir.ExportNamedDeclaration Update1(es2panda_Context context, ir.ExportNamedDeclaration original, ir.AstNode decl, sequence<ir.ExportSpecifier> specifiers, u32 specifiersLen);

    /* explicit ExportNamedDeclaration([[maybe_unused]] ArenaAllocator *allocator, AstNode *decl) */
    static ir.ExportNamedDeclaration Create2(es2panda_Context context, ir.AstNode decl);
    static ir.ExportNamedDeclaration Update2(es2panda_Context context, ir.ExportNamedDeclaration original, ir.AstNode decl);

    /* const AstNode *Decl() const */
    [get] ir.AstNode DeclConst(es2panda_Context context);

    /* const StringLiteral *Source() const */
    [get] ir.StringLiteral SourceConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ExportSpecifier *> &Specifiers() const noexcept */
    [get] sequence<ir.ExportSpecifier> SpecifiersConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ExportSpecifier *> &Specifiers() noexcept */
    [get] sequence<ir.ExportSpecifier> Specifiers(es2panda_Context context);

    /* void ReplaceSpecifiers(ArenaVector<ExportSpecifier *> &specifiers) */
    void ReplaceSpecifiers(es2panda_Context context, sequence<ir.ExportSpecifier> specifiers, u32 specifiersLen);

    /* [[nodiscard]] bool HasDumpData(bool hasDefaultExport) const noexcept */
    boolean HasDumpDataConst(es2panda_Context context, boolean hasDefaultExport);
};

[Entity=Class, Es2pandaAstNodeType=84, c_type=es2panda_AstNode] interface ETSParameterExpression: Expression {

    /* explicit ETSParameterExpression(AnnotatedExpression *identOrSpread, bool isOptional,
                                    ArenaAllocator *const allocator) */
    static ir.ETSParameterExpression Create(es2panda_Context context, ir.AnnotatedExpression identOrSpread, boolean isOptional);
    static ir.ETSParameterExpression Update(es2panda_Context context, ir.ETSParameterExpression original, ir.AnnotatedExpression identOrSpread, boolean isOptional);

    /* explicit ETSParameterExpression(AnnotatedExpression *identOrSpread, ir::Expression *initializer,
                                    ArenaAllocator *const allocator) */
    static ir.ETSParameterExpression Create1(es2panda_Context context, ir.AnnotatedExpression identOrSpread, ir.Expression initializer);
    static ir.ETSParameterExpression Update1(es2panda_Context context, ir.ETSParameterExpression original, ir.AnnotatedExpression identOrSpread, ir.Expression initializer);

    /* [[nodiscard]] const util::StringView &Name() const noexcept */
    String NameConst(es2panda_Context context);

    /* [[nodiscard]] const Identifier *Ident() const noexcept */
    ir.Identifier IdentConst(es2panda_Context context);

    /* [[nodiscard]] Identifier *Ident() noexcept */
    ir.Identifier Ident(es2panda_Context context);

    /* void SetIdent(Identifier *ident) noexcept */
    [set] void SetIdent(es2panda_Context context, ir.Identifier ident);

    /* SpreadElement *Spread() noexcept */
    [get] ir.SpreadElement Spread(es2panda_Context context);

    /* const SpreadElement *Spread() const noexcept */
    [get] ir.SpreadElement SpreadConst(es2panda_Context context);

    /* void SetSpread(SpreadElement *spread) */
    [set] void SetSpread(es2panda_Context context, ir.SpreadElement spread);

    /* [[nodiscard]] const SpreadElement *RestParameter() const noexcept */
    ir.SpreadElement RestParameterConst(es2panda_Context context);

    /* [[nodiscard]] SpreadElement *RestParameter() noexcept */
    ir.SpreadElement RestParameter(es2panda_Context context);

    /* [[nodiscard]] const Expression *Initializer() const noexcept */
    ir.Expression InitializerConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Initializer() noexcept */
    ir.Expression Initializer(es2panda_Context context);

    /* void SetLexerSaved(util::StringView savedLexer) */
    [set] void SetLexerSaved(es2panda_Context context, String savedLexer);

    /* [[nodiscard]] util::StringView LexerSaved() const noexcept */
    String LexerSavedConst(es2panda_Context context);

    /* [[nodiscard]] varbinder::Variable *Variable() const noexcept */
    varbinder.Variable VariableConst(es2panda_Context context);

    /* void SetVariable(varbinder::Variable *variable) noexcept */
    [set] void SetVariable(es2panda_Context context, varbinder.Variable variable);

    /* [[nodiscard]] TypeNode const *TypeAnnotation() const noexcept */
    ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() noexcept */
    ir.TypeNode TypeAnnotation(es2panda_Context context);

    /* void SetTypeAnnotation(TypeNode *typeNode) noexcept */
    [set] void SetTypeAnnotation(es2panda_Context context, ir.TypeNode typeNode);

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* void SetOptional(bool value) noexcept */
    [set] void SetOptional(es2panda_Context context, boolean value);

    /* void SetInitializer(Expression *initExpr) noexcept */
    [set] void SetInitializer(es2panda_Context context, ir.Expression initExpr);

    /* [[nodiscard]] bool IsRestParameter() const noexcept */
    [get] boolean IsRestParameterConst(es2panda_Context context);

    /* [[nodiscard]] std::size_t GetRequiredParams() const noexcept */
    [get] u32 GetRequiredParamsConst(es2panda_Context context);

    /* void SetRequiredParams(std::size_t const extraValue) */
    [set] void SetRequiredParams(es2panda_Context context, u32 extraValue);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=124, c_type=es2panda_AstNode] interface TSTypeParameterInstantiation: Expression {

    /* explicit TSTypeParameterInstantiation(ArenaVector<TypeNode *> &&params) */
    static ir.TSTypeParameterInstantiation Create(es2panda_Context context, sequence<ir.TypeNode> params, u32 paramsLen);
    static ir.TSTypeParameterInstantiation Update(es2panda_Context context, ir.TSTypeParameterInstantiation original, sequence<ir.TypeNode> params, u32 paramsLen);

    /* [[nodiscard]] const ArenaVector<TypeNode *> &Params() const noexcept */
    [get] sequence<ir.TypeNode> ParamsConst(es2panda_Context context);

    /* void SetParams(ArenaVector<TypeNode *> &&params) */
    [set] void SetParams(es2panda_Context context, sequence<ir.TypeNode> params, u32 paramsLen);
};

[Entity=Class, Es2pandaAstNodeType=50, c_type=es2panda_AstNode] interface NullLiteral: Literal {

    /* explicit NullLiteral() */
    static ir.NullLiteral Create(es2panda_Context context);
    static ir.NullLiteral Update(es2panda_Context context, ir.NullLiteral original);
};

[Entity=Class, Es2pandaAstNodeType=114, c_type=es2panda_AstNode] interface TSInferType: TypeNode {

    /* explicit TSInferType(TSTypeParameter *typeParam, ArenaAllocator *const allocator) */
    static ir.TSInferType Create(es2panda_Context context, ir.TSTypeParameter typeParam);
    static ir.TSInferType Update(es2panda_Context context, ir.TSInferType original, ir.TSTypeParameter typeParam);

    /* const TSTypeParameter *TypeParam() const */
    [get] ir.TSTypeParameter TypeParamConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=89, c_type=es2panda_AstNode] interface SwitchCaseStatement: Statement {

    /* explicit SwitchCaseStatement(Expression *test, ArenaVector<Statement *> &&consequent) */
    static ir.SwitchCaseStatement Create(es2panda_Context context, ir.Expression test, sequence<ir.Statement> consequent, u32 consequentLen);
    static ir.SwitchCaseStatement Update(es2panda_Context context, ir.SwitchCaseStatement original, ir.Expression test, sequence<ir.Statement> consequent, u32 consequentLen);

    /* [[nodiscard]] Expression *Test() noexcept */
    [get] ir.Expression Test(es2panda_Context context);

    /* [[nodiscard]] const Expression *Test() const noexcept */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* void SetTest(Expression *test) noexcept */
    [set] void SetTest(es2panda_Context context, ir.Expression test);

    /* [[nodiscard]] const ArenaVector<Statement *> &Consequent() const noexcept */
    [get] sequence<ir.Statement> ConsequentConst(es2panda_Context context);

    /* void SetConsequent(ArenaVector<Statement *> &&consequentList) noexcept */
    [set] void SetConsequent(es2panda_Context context, sequence<ir.Statement> consequentList, u32 consequentListLen);

    /* void CheckAndTestCase(checker::ETSChecker *checker, checker::Type *comparedExprType, checker::Type *unboxedDiscType,
                          ir::Expression *node, bool &isDefaultCase) */
    void CheckAndTestCase(es2panda_Context context, checker.Type comparedExprType, checker.Type unboxedDiscType, ir.Expression node, boolean isDefaultCase);
};

[Entity=Class, Es2pandaAstNodeType=157, c_type=es2panda_AstNode] interface YieldExpression: Expression {

    /* explicit YieldExpression(Expression *const argument, bool const isDelegate) */
    static ir.YieldExpression Create(es2panda_Context context, ir.Expression argument, boolean isDelegate);
    static ir.YieldExpression Update(es2panda_Context context, ir.YieldExpression original, ir.Expression argument, boolean isDelegate);

    /* [[nodiscard]] bool HasDelegate() const noexcept */
    [get] boolean HasDelegateConst(es2panda_Context context);

    /* [[nodiscard]] const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=128, c_type=es2panda_AstNode] interface TSImportEqualsDeclaration: Statement {

    /* explicit TSImportEqualsDeclaration(Identifier *id, Expression *moduleReference, bool isExport) */
    static ir.TSImportEqualsDeclaration Create(es2panda_Context context, ir.Identifier id, ir.Expression moduleReference, boolean isExport);
    static ir.TSImportEqualsDeclaration Update(es2panda_Context context, ir.TSImportEqualsDeclaration original, ir.Identifier id, ir.Expression moduleReference, boolean isExport);

    /* const Identifier *Id() const */
    [get] ir.Identifier IdConst(es2panda_Context context);

    /* const Expression *ModuleReference() const */
    [get] ir.Expression ModuleReferenceConst(es2panda_Context context);

    /* bool IsExport() const */
    [get] boolean IsExportConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=8, c_type=es2panda_AstNode] interface BooleanLiteral: Literal {

    /* explicit BooleanLiteral(bool const value) */
    static ir.BooleanLiteral Create(es2panda_Context context, boolean value);
    static ir.BooleanLiteral Update(es2panda_Context context, ir.BooleanLiteral original, boolean value);

    /* [[nodiscard]] bool Value() const noexcept */
    [get] boolean ValueConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=94, c_type=es2panda_AstNode] interface TSNumberKeyword: TypeNode {

    /* explicit TSNumberKeyword(ArenaAllocator *const allocator) */
    static ir.TSNumberKeyword Create(es2panda_Context context);
    static ir.TSNumberKeyword Update(es2panda_Context context, ir.TSNumberKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=18, c_type=es2panda_AstNode] interface ClassStaticBlock: ClassElement {

    /* explicit ClassStaticBlock(Expression *value, [[maybe_unused]] ArenaAllocator *allocator) */
    static ir.ClassStaticBlock Create(es2panda_Context context, ir.Expression value);
    static ir.ClassStaticBlock Update(es2panda_Context context, ir.ClassStaticBlock original, ir.Expression value);

    /* ir::ScriptFunction *Function() */
    ir.ScriptFunction Function(es2panda_Context context);

    /* const ir::ScriptFunction *Function() const */
    ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* void SetFunction(ir::ScriptFunction *function) */
    [set] void SetFunction(es2panda_Context context, ir.ScriptFunction function);

    /* const util::StringView &Name() const */
    String NameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=104, c_type=es2panda_AstNode] interface TSNonNullExpression: Expression {

    /* explicit TSNonNullExpression(Expression *expr) */
    static ir.TSNonNullExpression Create(es2panda_Context context, ir.Expression expr);
    static ir.TSNonNullExpression Update(es2panda_Context context, ir.TSNonNullExpression original, ir.Expression expr);

    /* const Expression *Expr() const noexcept */
    [get] ir.Expression ExprConst(es2panda_Context context);

    /* Expression *Expr() noexcept */
    [get] ir.Expression Expr(es2panda_Context context);

    /* void SetExpr(Expression *expr) noexcept */
    [set] void SetExpr(es2panda_Context context, ir.Expression expr);

    /* checker::Type *OriginalType() const noexcept */
    [get] checker.Type OriginalTypeConst(es2panda_Context context);

    /* void SetOriginalType(checker::Type *type) noexcept */
    [set] void SetOriginalType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=55, c_type=es2panda_AstNode] interface PrefixAssertionExpression: Expression {

    /* explicit PrefixAssertionExpression(Expression *expr, TypeNode *type) */
    static ir.PrefixAssertionExpression Create(es2panda_Context context, ir.Expression expr, ir.TypeNode type);
    static ir.PrefixAssertionExpression Update(es2panda_Context context, ir.PrefixAssertionExpression original, ir.Expression expr, ir.TypeNode type);

    /* const Expression *Expr() const */
    [get] ir.Expression ExprConst(es2panda_Context context);

    /* const TypeNode *Type() const */
    [get] ir.TypeNode TypeConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=16, c_type=es2panda_AstNode] interface ClassExpression: Expression {

    /* explicit ClassExpression(ClassDefinition *const def) */
    static ir.ClassExpression Create(es2panda_Context context, ir.ClassDefinition def);
    static ir.ClassExpression Update(es2panda_Context context, ir.ClassExpression original, ir.ClassDefinition def);

    /* [[nodiscard]] const ClassDefinition *Definition() const noexcept */
    [get] ir.ClassDefinition DefinitionConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=32, c_type=es2panda_AstNode] interface ForOfStatement: LoopStatement {

    /* explicit ForOfStatement(AstNode *left, Expression *right, Statement *body, bool const isAwait) */
    static ir.ForOfStatement Create(es2panda_Context context, ir.AstNode left, ir.Expression right, ir.Statement body, boolean isAwait);
    static ir.ForOfStatement Update(es2panda_Context context, ir.ForOfStatement original, ir.AstNode left, ir.Expression right, ir.Statement body, boolean isAwait);

    /* [[nodiscard]] AstNode *Left() noexcept */
    [get] ir.AstNode Left(es2panda_Context context);

    /* [[nodiscard]] const AstNode *Left() const noexcept */
    [get] ir.AstNode LeftConst(es2panda_Context context);

    /* void SetLeft(AstNode *left) */
    [set] void SetLeft(es2panda_Context context, ir.AstNode left);

    /* [[nodiscard]] Expression *Right() noexcept */
    [get] ir.Expression Right(es2panda_Context context);

    /* [[nodiscard]] const Expression *Right() const noexcept */
    [get] ir.Expression RightConst(es2panda_Context context);

    /* void SetRight(Expression *right) */
    [set] void SetRight(es2panda_Context context, ir.Expression right);

    /* [[nodiscard]] Statement *Body() noexcept */
    [get] ir.Statement Body(es2panda_Context context);

    /* [[nodiscard]] const Statement *Body() const noexcept */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* void SetBody(Statement *body) */
    [set] void SetBody(es2panda_Context context, ir.Statement body);

    /* [[nodiscard]] bool IsAwait() const noexcept */
    [get] boolean IsAwaitConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=147, c_type=es2panda_AstNode] interface TemplateLiteral: Expression {

    /* explicit TemplateLiteral(ArenaVector<TemplateElement *> &&quasis, ArenaVector<Expression *> &&expressions,
                             util::StringView multilineString) */
    static ir.TemplateLiteral Create(es2panda_Context context, sequence<ir.TemplateElement> quasis, u32 quasisLen, sequence<ir.Expression> expressions, u32 expressionsLen, String multilineString);
    static ir.TemplateLiteral Update(es2panda_Context context, ir.TemplateLiteral original, sequence<ir.TemplateElement> quasis, u32 quasisLen, sequence<ir.Expression> expressions, u32 expressionsLen, String multilineString);

    /* [[nodiscard]] const ArenaVector<TemplateElement *> &Quasis() const noexcept */
    [get] sequence<ir.TemplateElement> QuasisConst(es2panda_Context context);

    /* void SetQuasis(ArenaVector<TemplateElement *> &&quasisList) */
    [set] void SetQuasis(es2panda_Context context, sequence<ir.TemplateElement> quasisList, u32 quasisListLen);

    /* [[nodiscard]] const ArenaVector<Expression *> &Expressions() const noexcept */
    [get] sequence<ir.Expression> ExpressionsConst(es2panda_Context context);

    /* void SetExpressions(ArenaVector<Expression *> &&expressionsList) */
    [set] void SetExpressions(es2panda_Context context, sequence<ir.Expression> expressionsList, u32 expressionsListLen);

    /* util::StringView GetMultilineString() const */
    String GetMultilineStringConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=107, c_type=es2panda_AstNode] interface TSUnionType: TypeNode {

    /* explicit TSUnionType(ArenaVector<TypeNode *> &&types, ArenaAllocator *const allocator) */
    static ir.TSUnionType Create(es2panda_Context context, sequence<ir.TypeNode> types, u32 typesLen);
    static ir.TSUnionType Update(es2panda_Context context, ir.TSUnionType original, sequence<ir.TypeNode> types, u32 typesLen);

    /* const ArenaVector<TypeNode *> &Types() const */
    [get] sequence<ir.TypeNode> TypesConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=100, c_type=es2panda_AstNode] interface TSUnknownKeyword: TypeNode {

    /* explicit TSUnknownKeyword(ArenaAllocator *const allocator) */
    static ir.TSUnknownKeyword Create(es2panda_Context context);
    static ir.TSUnknownKeyword Update(es2panda_Context context, ir.TSUnknownKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=36, c_type=es2panda_AstNode] interface Identifier: AnnotatedExpression {

    /* explicit Identifier(ArenaAllocator *const allocator) */
    static ir.Identifier Create(es2panda_Context context);
    static ir.Identifier Update(es2panda_Context context, ir.Identifier original);

    /* explicit Identifier(util::StringView const name, ArenaAllocator *const allocator) */
    static ir.Identifier Create1(es2panda_Context context, String name);
    static ir.Identifier Update1(es2panda_Context context, ir.Identifier original, String name);

    /* explicit Identifier(util::StringView const name, TypeNode *const typeAnnotation, ArenaAllocator *const allocator) */
    static ir.Identifier Create2(es2panda_Context context, String name, ir.TypeNode typeAnnotation);
    static ir.Identifier Update2(es2panda_Context context, ir.Identifier original, String name, ir.TypeNode typeAnnotation);

    /* [[nodiscard]] const util::StringView &Name() const noexcept */
    [get] String NameConst(es2panda_Context context);

    /* [[nodiscard]] util::StringView &Name() noexcept */
    [get] String Name(es2panda_Context context);

    /* void SetName(const util::StringView &newName) noexcept */
    [set] void SetName(es2panda_Context context, String newName);

    /* bool IsErrorPlaceHolder() const noexcept */
    [get] boolean IsErrorPlaceHolderConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* void SetOptional(bool const optional) noexcept */
    [set] void SetOptional(es2panda_Context context, boolean optional_arg);

    /* [[nodiscard]] bool IsReference(ScriptExtension ext) const noexcept */
    [get] boolean IsReferenceConst(es2panda_Context context);

    /* [[nodiscard]] bool IsTdz() const noexcept */
    [get] boolean IsTdzConst(es2panda_Context context);

    /* void SetTdz() noexcept */
    [set] void SetTdz(es2panda_Context context);

    /* void SetAccessor() noexcept */
    [set] void SetAccessor(es2panda_Context context);

    /* [[nodiscard]] bool IsAccessor() const noexcept */
    [get] boolean IsAccessorConst(es2panda_Context context);

    /* void SetMutator() noexcept */
    [set] void SetMutator(es2panda_Context context);

    /* [[nodiscard]] bool IsMutator() const noexcept */
    [get] boolean IsMutatorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsReceiver() const noexcept */
    [get] boolean IsReceiverConst(es2panda_Context context);

    /* [[nodiscard]] bool IsPrivateIdent() const noexcept */
    [get] boolean IsPrivateIdentConst(es2panda_Context context);

    /* void SetPrivate(bool const isPrivate) noexcept */
    [set] void SetPrivate(es2panda_Context context, boolean isPrivate);

    /* [[nodiscard]] bool IsIgnoreBox() const noexcept */
    [get] boolean IsIgnoreBoxConst(es2panda_Context context);

    /* void SetIgnoreBox() noexcept */
    [set] void SetIgnoreBox(es2panda_Context context);

    /* [[nodiscard]] bool IsAnnotationDecl() const noexcept */
    [get] boolean IsAnnotationDeclConst(es2panda_Context context);

    /* void SetAnnotationDecl() noexcept */
    [set] void SetAnnotationDecl(es2panda_Context context);

    /* [[nodiscard]] bool IsAnnotationUsage() const noexcept */
    [get] boolean IsAnnotationUsageConst(es2panda_Context context);

    /* void SetAnnotationUsage() noexcept */
    [set] void SetAnnotationUsage(es2panda_Context context);

    /* [[nodiscard]] Identifier *CloneReference(ArenaAllocator *allocator, AstNode *parent) */
    ir.Identifier CloneReference(es2panda_Context context, ir.AstNode parent);

    /* IdentifierFlags IdFlags() const */
    [get] Es2pandaIdentifierFlags IdFlagsConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=158, c_type=es2panda_AstNode] interface OpaqueTypeNode: TypeNode {

    /* explicit OpaqueTypeNode(checker::Type *const type, ArenaAllocator *const allocator) */
    static ir.OpaqueTypeNode Create(es2panda_Context context, checker.Type type);
    static ir.OpaqueTypeNode Update(es2panda_Context context, ir.OpaqueTypeNode original, checker.Type type);

    /* explicit OpaqueTypeNode(ArenaAllocator *const allocator) */
    static ir.OpaqueTypeNode Create1(es2panda_Context context);
    static ir.OpaqueTypeNode Update1(es2panda_Context context, ir.OpaqueTypeNode original);
};

[Entity=Class, Es2pandaAstNodeType=7, c_type=es2panda_AstNode] interface BlockStatement: Statement {

    /* explicit BlockStatement(ArenaAllocator *allocator, ArenaVector<Statement *> &&statementList) */
    static ir.BlockStatement Create(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen);
    static ir.BlockStatement Update(es2panda_Context context, ir.BlockStatement original, sequence<ir.Statement> statementList, u32 statementListLen);

    /* void SetScope(varbinder::Scope *scope) noexcept */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* ArenaVector<Statement *> &StatementsForUpdates() */
    [get] sequence<ir.Statement> StatementsForUpdates(es2panda_Context context);

    /* const ArenaVector<Statement *> &Statements() */
    [get] sequence<ir.Statement> Statements(es2panda_Context context);

    /* const ArenaVector<Statement *> &Statements() const */
    [get] sequence<ir.Statement> StatementsConst(es2panda_Context context);

    /* void SetStatements(ArenaVector<Statement *> &&statementList) */
    [set] void SetStatements(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen);

    /* void AddStatements(const ArenaVector<Statement *> &statementList) */
    [set] void AddStatements(es2panda_Context context, sequence<ir.Statement> statementList, u32 statementListLen);

    /* void ClearStatements() */
    void ClearStatements(es2panda_Context context);

    /* void AddStatement(Statement *statement) */
    [set] void AddStatement(es2panda_Context context, ir.Statement statement);

    /* void AddStatement(std::size_t idx, Statement *statement) */
    [set] void AddStatement1(es2panda_Context context, u32 idx, ir.Statement statement);

    /* void AddTrailingBlock(AstNode *stmt, BlockStatement *trailingBlock) */
    [set] void AddTrailingBlock(es2panda_Context context, ir.AstNode stmt, ir.BlockStatement trailingBlock);

    /* BlockStatement *SearchStatementInTrailingBlock(Statement *item) */
    ir.BlockStatement SearchStatementInTrailingBlock(es2panda_Context context, ir.Statement item);
};

[Entity=Class, c_type=es2panda_AstNode] interface Statement: AstNode {

    /* virtual void SetReturnType([[maybe_unused]] checker::ETSChecker *checker, [[maybe_unused]] checker::Type *type) */
    [set] void SetReturnType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=23, c_type=es2panda_AstNode] interface DirectEvalExpression: CallExpression {

    /* explicit DirectEvalExpression(Expression *callee, ArenaVector<Expression *> &&arguments,
                                  TSTypeParameterInstantiation *typeParams, bool optional, uint32_t parserStatus) */
    static ir.DirectEvalExpression Create(es2panda_Context context, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen, ir.TSTypeParameterInstantiation typeParams, boolean optional_arg, u32 parserStatus);
    static ir.DirectEvalExpression Update(es2panda_Context context, ir.DirectEvalExpression original, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen, ir.TSTypeParameterInstantiation typeParams, boolean optional_arg, u32 parserStatus);
};

[Entity=Class, Es2pandaAstNodeType=123, c_type=es2panda_AstNode] interface TSTypeParameterDeclaration: Expression {

    /* explicit TSTypeParameterDeclaration(ArenaVector<TSTypeParameter *> &&params, size_t requiredParams) */
    static ir.TSTypeParameterDeclaration Create(es2panda_Context context, sequence<ir.TSTypeParameter> params, u32 paramsLen, u32 requiredParams);
    static ir.TSTypeParameterDeclaration Update(es2panda_Context context, ir.TSTypeParameterDeclaration original, sequence<ir.TSTypeParameter> params, u32 paramsLen, u32 requiredParams);

    /* void SetScope(varbinder::LocalScope *source) */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope source);

    /* const ArenaVector<TSTypeParameter *> &Params() const */
    [get] sequence<ir.TSTypeParameter> ParamsConst(es2panda_Context context);

    /* void SetParams(ArenaVector<TSTypeParameter *> &&paramsList) */
    [set] void SetParams(es2panda_Context context, sequence<ir.TSTypeParameter> paramsList, u32 paramsListLen);

    /* void AddParam(TSTypeParameter *param) */
    [set] void AddParam(es2panda_Context context, ir.TSTypeParameter param);

    /* void SetValueParams(TSTypeParameter *source, size_t index) */
    [set] void SetValueParams(es2panda_Context context, ir.TSTypeParameter source, u32 index);

    /* size_t RequiredParams() const */
    [get] u32 RequiredParamsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=47, c_type=es2panda_AstNode] interface MethodDefinition: ClassElement {

    /* explicit MethodDefinition(MethodDefinitionKind const kind, Expression *const key, Expression *const value,
                              ModifierFlags const modifiers, [[maybe_unused]] ArenaAllocator *const allocator,
                              bool const isComputed) */
    static ir.MethodDefinition Create(es2panda_Context context, Es2pandaMethodDefinitionKind kind, ir.Expression key, ir.Expression value, Es2pandaModifierFlags modifiers, boolean isComputed);
    static ir.MethodDefinition Update(es2panda_Context context, ir.MethodDefinition original, Es2pandaMethodDefinitionKind kind, ir.Expression key, ir.Expression value, Es2pandaModifierFlags modifiers, boolean isComputed);

    /* MethodDefinitionKind Kind() const */
    [get] Es2pandaMethodDefinitionKind KindConst(es2panda_Context context);

    /* [[nodiscard]] bool IsConstructor() const noexcept */
    [get] boolean IsConstructorConst(es2panda_Context context);

    /* [[nodiscard]] bool IsMethod() const noexcept */
    [get] boolean IsMethodConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionMethod() const noexcept */
    boolean IsExtensionMethodConst(es2panda_Context context);

    /* [[nodiscard]] bool IsGetter() const noexcept */
    [get] boolean IsGetterConst(es2panda_Context context);

    /* [[nodiscard]] bool IsSetter() const noexcept */
    [get] boolean IsSetterConst(es2panda_Context context);

    /* [[nodiscard]] bool IsDefaultAccessModifier() const noexcept */
    [get] boolean IsDefaultAccessModifierConst(es2panda_Context context);

    /* void SetDefaultAccessModifier(bool isDefault) */
    [set] void SetDefaultAccessModifier(es2panda_Context context, boolean isDefault);

    /* [[nodiscard]] const OverloadsT &Overloads() const noexcept */
    [get] sequence<ir.MethodDefinition> OverloadsConst(es2panda_Context context);

    /* [[nodiscard]] const MethodDefinition *BaseOverloadMethod() const noexcept */
    [get] ir.MethodDefinition BaseOverloadMethodConst(es2panda_Context context);

    /* [[nodiscard]] MethodDefinition *BaseOverloadMethod() noexcept */
    [get] ir.MethodDefinition BaseOverloadMethod(es2panda_Context context);

    /* [[nodiscard]] const MethodDefinition *AsyncPairMethod() const noexcept */
    [get] ir.MethodDefinition AsyncPairMethodConst(es2panda_Context context);

    /* [[nodiscard]] MethodDefinition *AsyncPairMethod() noexcept */
    [get] ir.MethodDefinition AsyncPairMethod(es2panda_Context context);

    /* [[nodiscard]] const OverloadInfo &GetOverloadInfo() noexcept */
    es2panda_OverloadInfo GetOverloadInfo(es2panda_Context context);

    /* [[nodiscard]] OverloadInfo &GetOverloadInfoForUpdate() noexcept */
    es2panda_OverloadInfo GetOverloadInfoForUpdate(es2panda_Context context);

    /* [[nodiscard]] const OverloadInfo &GetOverloadInfo() const noexcept */
    [get] es2panda_OverloadInfo GetOverloadInfoConst(es2panda_Context context);

    /* void SetOverloadInfo(OverloadInfo &&overloadInfo) */
    [set] void SetOverloadInfo(es2panda_Context context, es2panda_OverloadInfo overloadInfo);

    /* void SetOverloadInfo(OverloadInfo &overloadInfo) */
    [set] void SetOverloadInfo1(es2panda_Context context, es2panda_OverloadInfo overloadInfo);

    /* void SetOverloads(OverloadsT &&overloadsList) */
    [set] void SetOverloads(es2panda_Context context, sequence<ir.MethodDefinition> overloadsList, u32 overloadsListLen);

    /* void AddOverload(MethodDefinition *const overload) */
    [set] void AddOverload(es2panda_Context context, ir.MethodDefinition overload);

    /* void SetBaseOverloadMethod(MethodDefinition *const baseOverloadMethod) */
    [set] void SetBaseOverloadMethod(es2panda_Context context, ir.MethodDefinition baseOverloadMethod);

    /* void SetAsyncPairMethod(MethodDefinition *const asyncPairMethod) */
    [set] void SetAsyncPairMethod(es2panda_Context context, ir.MethodDefinition asyncPairMethod);

    /* [[nodiscard]] bool HasOverload(MethodDefinition *overload) noexcept */
    boolean HasOverload(es2panda_Context context, ir.MethodDefinition overload);

    /* ScriptFunction *Function() */
    ir.ScriptFunction Function(es2panda_Context context);

    /* const ScriptFunction *Function() const */
    ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* void InitializeOverloadInfo() */
    void InitializeOverloadInfo(es2panda_Context context);

    /* void ResolveReferences(const NodeTraverser &cb) const */
    void ResolveReferencesConst(es2panda_Context context, NodeTraverser cb);

    /* void EmplaceOverloads(MethodDefinition *overloads) */
    void EmplaceOverloads(es2panda_Context context, ir.MethodDefinition overloads);

    /* void ClearOverloads() */
    void ClearOverloads(es2panda_Context context);

    /* void SetValueOverloads(MethodDefinition *overloads, size_t index) */
    [set] void SetValueOverloads(es2panda_Context context, ir.MethodDefinition overloads, u32 index);
};

[Entity=Class, Es2pandaAstNodeType=54, c_type=es2panda_AstNode] interface OverloadDeclaration: ClassElement {

    /* explicit OverloadDeclaration(Expression *const key, ModifierFlags const modifiers,
                                 [[maybe_unused]] ArenaAllocator *const allocator) */
    static ir.OverloadDeclaration Create(es2panda_Context context, ir.Expression key, Es2pandaModifierFlags modifiers);
    static ir.OverloadDeclaration Update(es2panda_Context context, ir.OverloadDeclaration original, ir.Expression key, Es2pandaModifierFlags modifiers);

    /* OverloadDeclFlags Flag() const */
    [get] Es2pandaOverloadDeclFlags FlagConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::Expression *> &OverloadedList() noexcept */
    [get] sequence<ir.Expression> OverloadedList(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &OverloadedList() const noexcept */
    [get] sequence<ir.Expression> OverloadedListConst(es2panda_Context context);

    /* void SetOverloadedList(ArenaVector<Expression *> overloadedList) */
    [set] void SetOverloadedList(es2panda_Context context, sequence<ir.Expression> overloadedList, u32 overloadedListLen);

    /* void PushFront(Identifier *const overloadedExpression) */
    void PushFront(es2panda_Context context, ir.Identifier overloadedExpression);

    /* void AddOverloadDeclFlag(OverloadDeclFlags overloadFlag) */
    [set] void AddOverloadDeclFlag(es2panda_Context context, Es2pandaOverloadDeclFlags overloadFlag);

    /* [[nodiscard]] bool HasOverloadDeclFlag(OverloadDeclFlags overloadFlag) const */
    [get] boolean HasOverloadDeclFlagConst(es2panda_Context context, Es2pandaOverloadDeclFlags overloadFlag);

    /* [[nodiscard]] bool IsConstructorOverloadDeclaration() */
    [get] boolean IsConstructorOverloadDeclaration(es2panda_Context context);

    /* [[nodiscard]] bool IsFunctionOverloadDeclaration() */
    [get] boolean IsFunctionOverloadDeclaration(es2panda_Context context);

    /* [[nodiscard]] bool IsClassMethodOverloadDeclaration() */
    [get] boolean IsClassMethodOverloadDeclaration(es2panda_Context context);

    /* [[nodiscard]] bool IsInterfaceMethodOverloadDeclaration() */
    [get] boolean IsInterfaceMethodOverloadDeclaration(es2panda_Context context);

    /* void ResolveReferences(const NodeTraverser &cb) const */
    void ResolveReferencesConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpModifier(ir::SrcDumper *dumper) const */
    void DumpModifierConst(es2panda_Context context, ir.SrcDumper dumper);
};

[Entity=Class, Es2pandaAstNodeType=105, c_type=es2panda_AstNode] interface TSNullKeyword: TypeNode {

    /* explicit TSNullKeyword(ArenaAllocator *const allocator) */
    static ir.TSNullKeyword Create(es2panda_Context context);
    static ir.TSNullKeyword Update(es2panda_Context context, ir.TSNullKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=137, c_type=es2panda_AstNode] interface TSInterfaceHeritage: Expression {

    /* explicit TSInterfaceHeritage(TypeNode *expr) */
    static ir.TSInterfaceHeritage Create(es2panda_Context context, ir.TypeNode expr);
    static ir.TSInterfaceHeritage Update(es2panda_Context context, ir.TSInterfaceHeritage original, ir.TypeNode expr);

    /* TypeNode *Expr() */
    [get] ir.TypeNode Expr(es2panda_Context context);

    /* const TypeNode *Expr() const */
    [get] ir.TypeNode ExprConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface Expression: TypedAstNode {

    /* [[nodiscard]] bool IsGrouped() const noexcept */
    [get] boolean IsGroupedConst(es2panda_Context context);

    /* void SetGrouped() noexcept */
    [set] void SetGrouped(es2panda_Context context);

    /* [[nodiscard]] const Literal *AsLiteral() const */
    ir.Literal AsLiteralConst(es2panda_Context context);

    /* [[nodiscard]] Literal *AsLiteral() */
    ir.Literal AsLiteral(es2panda_Context context);

    /* [[nodiscard]] virtual bool IsLiteral() const noexcept */
    [get] boolean IsLiteralConst(es2panda_Context context);

    /* [[nodiscard]] virtual bool IsTypeNode() const noexcept */
    [get] boolean IsTypeNodeConst(es2panda_Context context);

    /* [[nodiscard]] virtual bool IsAnnotatedExpression() const noexcept */
    [get] boolean IsAnnotatedExpressionConst(es2panda_Context context);

    /* [[nodiscard]] TypeNode *AsTypeNode() */
    ir.TypeNode AsTypeNode(es2panda_Context context);

    /* [[nodiscard]] const TypeNode *AsTypeNode() const */
    ir.TypeNode AsTypeNodeConst(es2panda_Context context);

    /* [[nodiscard]] AnnotatedExpression *AsAnnotatedExpression() */
    ir.AnnotatedExpression AsAnnotatedExpression(es2panda_Context context);

    /* [[nodiscard]] const AnnotatedExpression *AsAnnotatedExpression() const */
    ir.AnnotatedExpression AsAnnotatedExpressionConst(es2panda_Context context);

    /* bool IsBrokenExpression() const noexcept */
    boolean IsBrokenExpressionConst(es2panda_Context context);

    /* [[nodiscard]] virtual std::string ToString() const */
    String ToStringConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, c_type=es2panda_AstNode] interface AnnotatedExpression: Expression {

    /* void SetTypeAnnotation(TypeNode *typeAnnotation) */
    [set] void SetTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, c_type=es2panda_AstNode] interface MaybeOptionalExpression: Expression {

    /* [[nodiscard]] bool IsOptional() const noexcept */
    [get] boolean IsOptionalConst(es2panda_Context context);

    /* void ClearOptional() noexcept */
    void ClearOptional(es2panda_Context context);
};

[Entity=Class] interface Declgen {
};

[Entity=Class, c_type=es2panda_SrcDumper] interface SrcDumper {

    /* explicit SrcDumper([[maybe_unused]] const ir::AstNode *node) */
    static ir.SrcDumper Create(es2panda_Context context, ir.AstNode node);

    /* explicit SrcDumper([[maybe_unused]] const ir::AstNode *node, [[maybe_unused]] bool isDeclgen) */
    static ir.SrcDumper Create1(es2panda_Context context, ir.AstNode node, boolean isDeclgen);

    /* void Add(std::string_view str) */
    [set] void Add(es2panda_Context context, String str);

    /* void Add(char ch) */
    [set] void Add1(es2panda_Context context, i8 ch);

    /* void Add(int8_t i) */
    [set] void Add2(es2panda_Context context, i8 i);

    /* void Add(int16_t i) */
    [set] void Add3(es2panda_Context context, i16 i);

    /* void Add(int32_t i) */
    [set] void Add4(es2panda_Context context, i32 i);

    /* void Add(int64_t l) */
    [set] void Add5(es2panda_Context context, i64 l);

    /* void Add(float f) */
    [set] void Add6(es2panda_Context context, f32 f);

    /* void Add(double d) */
    [set] void Add7(es2panda_Context context, f64 d);

    /* std::string Str() const */
    String StrConst(es2panda_Context context);

    /* void IncrIndent() */
    void IncrIndent(es2panda_Context context);

    /* void DecrIndent() */
    void DecrIndent(es2panda_Context context);

    /* void Endl(size_t num = 1) */
    void Endl(es2panda_Context context, u32 num);

    /* bool IsDeclgen() const */
    boolean IsDeclgenConst(es2panda_Context context);

    /* void TryDeclareAmbientContext() */
    void TryDeclareAmbientContext(es2panda_Context context);

    /* void DumpJsdocBeforeTargetNode(const ir::AstNode *inputNode) */
    void DumpJsdocBeforeTargetNode(es2panda_Context context, ir.AstNode inputNode);

    /* void DumpExports() */
    void DumpExports(es2panda_Context context);

    /* void SetDefaultExport() noexcept */
    [set] void SetDefaultExport(es2panda_Context context);

    /* [[nodiscard]] bool HasDefaultExport() const noexcept */
    boolean HasDefaultExportConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=74, c_type=es2panda_AstNode] interface ETSClassLiteral: Expression {

    /* explicit ETSClassLiteral(ir::TypeNode *const expr) */
    static ir.ETSClassLiteral Create(es2panda_Context context, ir.TypeNode expr);
    static ir.ETSClassLiteral Update(es2panda_Context context, ir.ETSClassLiteral original, ir.TypeNode expr);

    /* [[nodiscard]] ir::TypeNode *Expr() const noexcept */
    [get] ir.TypeNode ExprConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=77, c_type=es2panda_AstNode] interface ETSDestructuring: AnnotatedExpression {

    /* explicit ETSDestructuring(ArenaAllocator *allocator) noexcept */
    static ir.ETSDestructuring Create(es2panda_Context context);
    static ir.ETSDestructuring Update(es2panda_Context context, ir.ETSDestructuring original);

    /* explicit ETSDestructuring(ArenaVector<Expression *> elements) noexcept */
    static ir.ETSDestructuring Create1(es2panda_Context context, sequence<ir.Expression> elements, u32 elementsLen);
    static ir.ETSDestructuring Update1(es2panda_Context context, ir.ETSDestructuring original, sequence<ir.Expression> elements, u32 elementsLen);

    /* Expression *GetExpressionAtIndex(std::size_t index) */
    ir.Expression GetExpressionAtIndex(es2panda_Context context, u32 index);

    /* ArenaVector<Expression *> Elements() */
    [get] sequence<ir.Expression> Elements(es2panda_Context context);

    /* ArenaVector<Expression *> Elements() const */
    [get] sequence<ir.Expression> ElementsConst(es2panda_Context context);

    /* std::size_t Size() const */
    [get] u32 SizeConst(es2panda_Context context);

    /* void SetValueTypes(Expression *expr, size_t index) const */
    [set] void SetValueTypesConst(es2panda_Context context, ir.Expression expr, u32 index);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=9, c_type=es2panda_AstNode] interface BreakStatement: Statement {

    /* explicit BreakStatement() */
    static ir.BreakStatement Create(es2panda_Context context);
    static ir.BreakStatement Update(es2panda_Context context, ir.BreakStatement original);

    /* explicit BreakStatement(Identifier *ident) */
    static ir.BreakStatement Create1(es2panda_Context context, ir.Identifier ident);
    static ir.BreakStatement Update1(es2panda_Context context, ir.BreakStatement original, ir.Identifier ident);

    /* [[nodiscard]] const Identifier *Ident() const noexcept */
    [get] ir.Identifier IdentConst(es2panda_Context context);

    /* Identifier *Ident() noexcept */
    [get] ir.Identifier Ident(es2panda_Context context);

    /* [[nodiscard]] const ir::AstNode *Target() const */
    ir.AstNode TargetConst(es2panda_Context context);

    /* [[nodiscard]] bool HasTarget() const noexcept */
    [get] boolean HasTargetConst(es2panda_Context context);

    /* void SetTarget(ir::AstNode const *target) noexcept */
    [set] void SetTarget(es2panda_Context context, ir.AstNode target);
};

[Entity=Class, Es2pandaAstNodeType=57, c_type=es2panda_AstNode] interface RegExpLiteral: Literal {

    /* explicit RegExpLiteral(util::StringView pattern, lexer::RegExpFlags flags, util::StringView flagsStr) */
    static ir.RegExpLiteral Create(es2panda_Context context, String pattern, Es2pandaRegExpFlags flags, String flagsStr);
    static ir.RegExpLiteral Update(es2panda_Context context, ir.RegExpLiteral original, String pattern, Es2pandaRegExpFlags flags, String flagsStr);

    /* [[nodiscard]] const util::StringView &Pattern() const noexcept */
    [get] String PatternConst(es2panda_Context context);

    /* [[nodiscard]] const lexer::RegExpFlags &Flags() const noexcept */
    [get] Es2pandaRegExpFlags FlagsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=118, c_type=es2panda_AstNode] interface TSMappedType: TypeNode {

    /* explicit TSMappedType(TSTypeParameter *typeParameter, TypeNode *typeAnnotation, MappedOption readonly,
                          MappedOption optional, ArenaAllocator *const allocator) */
    static ir.TSMappedType Create(es2panda_Context context, ir.TSTypeParameter typeParameter, ir.TypeNode typeAnnotation, Es2pandaMappedOption readonly_arg, Es2pandaMappedOption optional_arg);
    static ir.TSMappedType Update(es2panda_Context context, ir.TSMappedType original, ir.TSTypeParameter typeParameter, ir.TypeNode typeAnnotation, Es2pandaMappedOption readonly_arg, Es2pandaMappedOption optional_arg);

    /* TSTypeParameter *TypeParameter() */
    [get] ir.TSTypeParameter TypeParameter(es2panda_Context context);

    /* TypeNode *TypeAnnotation() */
    [get] ir.TypeNode TypeAnnotation(es2panda_Context context);

    /* MappedOption Readonly() */
    [get] Es2pandaMappedOption Readonly(es2panda_Context context);

    /* MappedOption Optional() */
    [get] Es2pandaMappedOption Optional(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=95, c_type=es2panda_AstNode] interface TSAnyKeyword: TypeNode {

    /* explicit TSAnyKeyword(ArenaAllocator *const allocator) */
    static ir.TSAnyKeyword Create(es2panda_Context context);
    static ir.TSAnyKeyword Update(es2panda_Context context, ir.TSAnyKeyword original);
};

[Entity=Class, Es2pandaAstNodeType=15, c_type=es2panda_AstNode] interface ClassDeclaration: Statement {

    /* explicit ClassDeclaration(ClassDefinition *def, [[maybe_unused]] ArenaAllocator *allocator) */
    static ir.ClassDeclaration Create(es2panda_Context context, ir.ClassDefinition def);
    static ir.ClassDeclaration Update(es2panda_Context context, ir.ClassDeclaration original, ir.ClassDefinition def);

    /* ClassDefinition *Definition() */
    [get] ir.ClassDefinition Definition(es2panda_Context context);

    /* const ClassDefinition *Definition() const */
    [get] ir.ClassDefinition DefinitionConst(es2panda_Context context);

    /* void SetDefinition(ClassDefinition *def) */
    [set] void SetDefinition(es2panda_Context context, ir.ClassDefinition def);
};

[Entity=Class, Es2pandaAstNodeType=134, c_type=es2panda_AstNode] interface TSIndexedAccessType: TypeNode {

    /* explicit TSIndexedAccessType(TypeNode *objectType, TypeNode *indexType, ArenaAllocator *const allocator) */
    static ir.TSIndexedAccessType Create(es2panda_Context context, ir.TypeNode objectType, ir.TypeNode indexType);
    static ir.TSIndexedAccessType Update(es2panda_Context context, ir.TSIndexedAccessType original, ir.TypeNode objectType, ir.TypeNode indexType);

    /* const TypeNode *ObjectType() const */
    [get] ir.TypeNode ObjectTypeConst(es2panda_Context context);

    /* const TypeNode *IndexType() const */
    [get] ir.TypeNode IndexTypeConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=133, c_type=es2panda_AstNode] interface TSQualifiedName: Expression {

    /* explicit TSQualifiedName(Expression *left, Identifier *right, ArenaAllocator *allocator) */
    static ir.TSQualifiedName Create(es2panda_Context context, ir.Expression left, ir.Identifier right);
    static ir.TSQualifiedName Update(es2panda_Context context, ir.TSQualifiedName original, ir.Expression left, ir.Identifier right);

    /* [[nodiscard]] const Expression *Left() const noexcept */
    [get] ir.Expression LeftConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Left() noexcept */
    [get] ir.Expression Left(es2panda_Context context);

    /* [[nodiscard]] const Identifier *Right() const noexcept */
    [get] ir.Identifier RightConst(es2panda_Context context);

    /* [[nodiscard]] Identifier *Right() noexcept */
    [get] ir.Identifier Right(es2panda_Context context);

    /* [[nodiscard]] util::StringView Name() const */
    String NameConst(es2panda_Context context);

    /* ir::TSQualifiedName *ResolveLeftMostQualifiedName() */
    ir.TSQualifiedName ResolveLeftMostQualifiedName(es2panda_Context context);

    /* const ir::TSQualifiedName *ResolveLeftMostQualifiedName() const */
    ir.TSQualifiedName ResolveLeftMostQualifiedNameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=4, c_type=es2panda_AstNode] interface AwaitExpression: Expression {

    /* explicit AwaitExpression(Expression *argument) */
    static ir.AwaitExpression Create(es2panda_Context context, ir.Expression argument);
    static ir.AwaitExpression Update(es2panda_Context context, ir.AwaitExpression original, ir.Expression argument);

    /* [[nodiscard]] const Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_ValidationInfo] interface ValidationInfo {

    /* ValidationInfo() noexcept = default */
    static ir.ValidationInfo Create(es2panda_Context context);

    /* ValidationInfo(util::StringView m, lexer::SourcePosition p) noexcept */
    static ir.ValidationInfo Create1(es2panda_Context context, String m, es2panda_SourcePosition p);

    /* inline bool Fail() const */
    [get] boolean FailConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=20, c_type=es2panda_AstNode] interface ContinueStatement: Statement {

    /* explicit ContinueStatement() */
    static ir.ContinueStatement Create(es2panda_Context context);
    static ir.ContinueStatement Update(es2panda_Context context, ir.ContinueStatement original);

    /* explicit ContinueStatement(Identifier *ident) */
    static ir.ContinueStatement Create1(es2panda_Context context, ir.Identifier ident);
    static ir.ContinueStatement Update1(es2panda_Context context, ir.ContinueStatement original, ir.Identifier ident);

    /* [[nodiscard]] const Identifier *Ident() const noexcept */
    [get] ir.Identifier IdentConst(es2panda_Context context);

    /* Identifier *Ident() noexcept */
    [get] ir.Identifier Ident(es2panda_Context context);

    /* [[nodiscard]] const ir::AstNode *Target() const */
    ir.AstNode TargetConst(es2panda_Context context);

    /* [[nodiscard]] bool HasTarget() const noexcept */
    [get] boolean HasTargetConst(es2panda_Context context);

    /* void SetTarget(ir::AstNode const *target) noexcept */
    [set] void SetTarget(es2panda_Context context, ir.AstNode target);
};

[Entity=Class, Es2pandaAstNodeType=81, c_type=es2panda_AstNode] interface ETSNewMultiDimArrayInstanceExpression: Expression {

    /* explicit ETSNewMultiDimArrayInstanceExpression(ir::TypeNode *const typeReference,
                                                   ArenaVector<ir::Expression *> &&dimensions) */
    static ir.ETSNewMultiDimArrayInstanceExpression Create(es2panda_Context context, ir.TypeNode typeReference, sequence<ir.Expression> dimensions, u32 dimensionsLen);
    static ir.ETSNewMultiDimArrayInstanceExpression Update(es2panda_Context context, ir.ETSNewMultiDimArrayInstanceExpression original, ir.TypeNode typeReference, sequence<ir.Expression> dimensions, u32 dimensionsLen);

    /* explicit ETSNewMultiDimArrayInstanceExpression(ETSNewMultiDimArrayInstanceExpression const &other,
                                                   ArenaAllocator *allocator) */
    static ir.ETSNewMultiDimArrayInstanceExpression Create1(es2panda_Context context, ir.ETSNewMultiDimArrayInstanceExpression other);
    static ir.ETSNewMultiDimArrayInstanceExpression Update1(es2panda_Context context, ir.ETSNewMultiDimArrayInstanceExpression original, ir.ETSNewMultiDimArrayInstanceExpression other);

    /* [[nodiscard]] ir::TypeNode *TypeReference() noexcept */
    [get] ir.TypeNode TypeReference(es2panda_Context context);

    /* [[nodiscard]] ir::TypeNode const *TypeReference() const noexcept */
    [get] ir.TypeNode TypeReferenceConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::Expression *> &Dimensions() noexcept */
    [get] sequence<ir.Expression> Dimensions(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::Expression *> const &Dimensions() const noexcept */
    [get] sequence<ir.Expression> DimensionsConst(es2panda_Context context);

    /* [[nodiscard]] checker::Signature *Signature() noexcept */
    [get] checker.Signature Signature(es2panda_Context context);

    /* [[nodiscard]] const checker::Signature *Signature() const noexcept */
    [get] checker.Signature SignatureConst(es2panda_Context context);

    /* void SetSignature(checker::Signature *signature) noexcept */
    [set] void SetSignature(es2panda_Context context, checker.Signature signature);

    /* void SetPreferredTypeBasedOnFuncParam(checker::ETSChecker *checker, checker::Type *param,
                                          checker::TypeRelationFlag flags) */
    [set] void SetPreferredTypeBasedOnFuncParam(es2panda_Context context, checker.Type param, Es2pandaTypeRelationFlag flags);

    /* void ClearPreferredType() */
    void ClearPreferredType(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=139, c_type=es2panda_AstNode] interface TSNamedTupleMember: TypeNode {

    /* explicit TSNamedTupleMember(Expression *label, TypeNode *elementType, bool optional,
                                ArenaAllocator *const allocator) */
    static ir.TSNamedTupleMember Create(es2panda_Context context, ir.Expression label, ir.TypeNode elementType, boolean optional_arg);
    static ir.TSNamedTupleMember Update(es2panda_Context context, ir.TSNamedTupleMember original, ir.Expression label, ir.TypeNode elementType, boolean optional_arg);

    /* const Expression *Label() const */
    [get] ir.Expression LabelConst(es2panda_Context context);

    /* TypeNode *ElementType() */
    [get] ir.TypeNode ElementType(es2panda_Context context);

    /* const TypeNode *ElementType() const */
    [get] ir.TypeNode ElementTypeConst(es2panda_Context context);

    /* bool IsOptional() const */
    [get] boolean IsOptionalConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=40, c_type=es2panda_AstNode] interface ImportExpression: Expression {

    /* explicit ImportExpression(Expression *source) */
    static ir.ImportExpression Create(es2panda_Context context, ir.Expression source);
    static ir.ImportExpression Update(es2panda_Context context, ir.ImportExpression original, ir.Expression source);

    /* Expression *Source() */
    [get] ir.Expression Source(es2panda_Context context);

    /* Expression const *Source() const */
    [get] ir.Expression SourceConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstDumper] interface AstDumper {

    /* explicit AstDumper(const ir::AstNode *node, util::StringView sourceCode = "") */
    static ir.AstDumper Create(es2panda_Context context, ir.AstNode node, String sourceCode);

    /* static const char *ModifierToString(ModifierFlags flags) */
    String ModifierToString(es2panda_Context context, Es2pandaModifierFlags flags);

    /* static const char *TypeOperatorToString(TSOperatorType operatorType) */
    String TypeOperatorToString(es2panda_Context context, Es2pandaTSOperatorType operatorType);

    /* std::string Str() const */
    [get] String StrConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=64, c_type=es2panda_AstNode] interface ETSNullType: TypeNode {

    /* explicit ETSNullType(ArenaAllocator *const allocator) */
    static ir.ETSNullType Create(es2panda_Context context);
    static ir.ETSNullType Update(es2panda_Context context, ir.ETSNullType original);
};

[Entity=Class, Es2pandaAstNodeType=65, c_type=es2panda_AstNode] interface ETSUndefinedType: TypeNode {

    /* explicit ETSUndefinedType(ArenaAllocator *const allocator) */
    static ir.ETSUndefinedType Create(es2panda_Context context);
    static ir.ETSUndefinedType Update(es2panda_Context context, ir.ETSUndefinedType original);
};

[Entity=Class, Es2pandaAstNodeType=149, c_type=es2panda_AstNode] interface TypeofExpression: Expression {

    /* explicit TypeofExpression(Expression *const argument) */
    static ir.TypeofExpression Create(es2panda_Context context, ir.Expression argument);
    static ir.TypeofExpression Update(es2panda_Context context, ir.TypeofExpression original, ir.Expression argument);

    /* [[nodiscard]] Expression *Argument() const noexcept */
    [get] ir.Expression ArgumentConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=92, c_type=es2panda_AstNode] interface TSEnumMember: Statement {

    /* explicit TSEnumMember(Expression *key, Expression *init) */
    static ir.TSEnumMember Create(es2panda_Context context, ir.Expression key, ir.Expression init);
    static ir.TSEnumMember Update(es2panda_Context context, ir.TSEnumMember original, ir.Expression key, ir.Expression init);

    /* explicit TSEnumMember(Expression *key, Expression *init, bool isGenerated) */
    static ir.TSEnumMember Create1(es2panda_Context context, ir.Expression key, ir.Expression init, boolean isGenerated);
    static ir.TSEnumMember Update1(es2panda_Context context, ir.TSEnumMember original, ir.Expression key, ir.Expression init, boolean isGenerated);

    /* const Expression *Key() const */
    [get] ir.Expression KeyConst(es2panda_Context context);

    /* Expression *Key() */
    [get] ir.Expression Key(es2panda_Context context);

    /* const Expression *Init() const */
    [get] ir.Expression InitConst(es2panda_Context context);

    /* Expression *Init() */
    [get] ir.Expression Init(es2panda_Context context);

    /* bool IsGenerated() const */
    [get] boolean IsGeneratedConst(es2panda_Context context);

    /* [[nodiscard]] util::StringView Name() const */
    String NameConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=90, c_type=es2panda_AstNode] interface SwitchStatement: Statement {

    /* explicit SwitchStatement(Expression *discriminant, ArenaVector<SwitchCaseStatement *> &&cases) */
    static ir.SwitchStatement Create(es2panda_Context context, ir.Expression discriminant, sequence<ir.SwitchCaseStatement> cases, u32 casesLen);
    static ir.SwitchStatement Update(es2panda_Context context, ir.SwitchStatement original, ir.Expression discriminant, sequence<ir.SwitchCaseStatement> cases, u32 casesLen);

    /* [[nodiscard]] const Expression *Discriminant() const noexcept */
    [get] ir.Expression DiscriminantConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Discriminant() noexcept */
    [get] ir.Expression Discriminant(es2panda_Context context);

    /* void SetDiscriminant(Expression *discriminant) noexcept */
    [set] void SetDiscriminant(es2panda_Context context, ir.Expression discriminant);

    /* [[nodiscard]] const ArenaVector<SwitchCaseStatement *> &Cases() const noexcept */
    [get] sequence<ir.SwitchCaseStatement> CasesConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<SwitchCaseStatement *> &Cases() noexcept */
    [get] sequence<ir.SwitchCaseStatement> Cases(es2panda_Context context);

    /* void SetCases(ArenaVector<SwitchCaseStatement *> &&casesList) */
    [set] void SetCases(es2panda_Context context, sequence<ir.SwitchCaseStatement> casesList, u32 casesListLen);

    /* void SetScope(varbinder::LocalScope *scope) noexcept */
    [set] void SetScope(es2panda_Context context, varbinder.LocalScope scope);
};

[Entity=Class, Es2pandaAstNodeType=24, c_type=es2panda_AstNode] interface DoWhileStatement: LoopStatement {

    /* explicit DoWhileStatement(Statement *body, Expression *test) */
    static ir.DoWhileStatement Create(es2panda_Context context, ir.Statement body, ir.Expression test);
    static ir.DoWhileStatement Update(es2panda_Context context, ir.DoWhileStatement original, ir.Statement body, ir.Expression test);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* Statement *Body() */
    [get] ir.Statement Body(es2panda_Context context);

    /* void SetBody(Statement *body) */
    [set] void SetBody(es2panda_Context context, ir.Statement body);

    /* const Expression *Test() const */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* Expression *Test() */
    [get] ir.Expression Test(es2panda_Context context);

    /* void SetTest(Expression *test) */
    [set] void SetTest(es2panda_Context context, ir.Expression test);
};

[Entity=Class, Es2pandaAstNodeType=11, c_type=es2panda_AstNode] interface CatchClause: TypedStatement {

    /* explicit CatchClause(Expression *param, BlockStatement *body) */
    static ir.CatchClause Create(es2panda_Context context, ir.Expression param, ir.BlockStatement body);
    static ir.CatchClause Update(es2panda_Context context, ir.CatchClause original, ir.Expression param, ir.BlockStatement body);

    /* explicit CatchClause(CatchClause const &other, ArenaAllocator *allocator) */
    static ir.CatchClause Create1(es2panda_Context context, ir.CatchClause other);
    static ir.CatchClause Update1(es2panda_Context context, ir.CatchClause original, ir.CatchClause other);

    /* Expression *Param() */
    [get] ir.Expression Param(es2panda_Context context);

    /* const Expression *Param() const */
    [get] ir.Expression ParamConst(es2panda_Context context);

    /* BlockStatement *Body() */
    [get] ir.BlockStatement Body(es2panda_Context context);

    /* const BlockStatement *Body() const */
    [get] ir.BlockStatement BodyConst(es2panda_Context context);

    /* void SetScope(varbinder::CatchScope *scope) */
    [set] void SetScope(es2panda_Context context, varbinder.CatchScope scope);

    /* bool IsDefaultCatchClause() const */
    boolean IsDefaultCatchClauseConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type const *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() */
    [get] checker.Type TsType(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [set] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* [[nodiscard]] checker::Type *PreferredType() const noexcept */
    [get] checker.Type PreferredTypeConst(es2panda_Context context);

    /* checker::Type *SetPreferredType(checker::Type *type) noexcept */
    [get] checker.Type SetPreferredType(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=61, c_type=es2panda_AstNode] interface SequenceExpression: Expression {

    /* explicit SequenceExpression(ArenaVector<Expression *> &&sequence) */
    static ir.SequenceExpression Create(es2panda_Context context, sequence<ir.Expression> sequence_arg, u32 sequenceLen);
    static ir.SequenceExpression Update(es2panda_Context context, ir.SequenceExpression original, sequence<ir.Expression> sequence_arg, u32 sequenceLen);

    /* [[nodiscard]] const ArenaVector<Expression *> &Sequence() const noexcept */
    [get] sequence<ir.Expression> SequenceConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Expression *> &Sequence() noexcept */
    [get] sequence<ir.Expression> Sequence(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=0, c_type=es2panda_AstNode] interface ArrowFunctionExpression: Expression {

    /* explicit ArrowFunctionExpression(ScriptFunction *const func, ArenaAllocator *const allocator) */
    static ir.ArrowFunctionExpression Create(es2panda_Context context, ir.ScriptFunction func);
    static ir.ArrowFunctionExpression Update(es2panda_Context context, ir.ArrowFunctionExpression original, ir.ScriptFunction func);

    /* explicit ArrowFunctionExpression(ArrowFunctionExpression const &other, ArenaAllocator *const allocator) */
    static ir.ArrowFunctionExpression Create1(es2panda_Context context, ir.ArrowFunctionExpression other);
    static ir.ArrowFunctionExpression Update1(es2panda_Context context, ir.ArrowFunctionExpression original, ir.ArrowFunctionExpression other);

    /* [[nodiscard]] const ScriptFunction *Function() const noexcept */
    [get] ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* [[nodiscard]] ScriptFunction *Function() noexcept */
    [get] ir.ScriptFunction Function(es2panda_Context context);

    /* void SetFunction(ScriptFunction *func) */
    [set] void SetFunction(es2panda_Context context, ir.ScriptFunction func);

    /* ir::TypeNode *CreateTypeAnnotation(checker::ETSChecker *checker) */
    ir.TypeNode CreateTypeAnnotation(es2panda_Context context);

    /* ir::TypeNode *CreateReturnNodeFromType(checker::ETSChecker *checker, checker::Type *returnType) */
    ir.TypeNode CreateReturnNodeFromType(es2panda_Context context, checker.Type returnType);

    /* bool IsVarFromSubscope(const varbinder::Variable *var) const */
    boolean IsVarFromSubscopeConst(es2panda_Context context, varbinder.Variable var);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=53, c_type=es2panda_AstNode] interface OmittedExpression: Expression {

    /* explicit OmittedExpression() */
    static ir.OmittedExpression Create(es2panda_Context context);
    static ir.OmittedExpression Update(es2panda_Context context, ir.OmittedExpression original);
};

[Entity=Class, Es2pandaAstNodeType=82, c_type=es2panda_AstNode] interface ETSNewClassInstanceExpression: Expression {

    /* explicit ETSNewClassInstanceExpression(ir::Expression *const typeReference,
                                           ArenaVector<ir::Expression *> &&arguments) */
    static ir.ETSNewClassInstanceExpression Create(es2panda_Context context, ir.Expression typeReference, sequence<ir.Expression> arguments, u32 argumentsLen);
    static ir.ETSNewClassInstanceExpression Update(es2panda_Context context, ir.ETSNewClassInstanceExpression original, ir.Expression typeReference, sequence<ir.Expression> arguments, u32 argumentsLen);

    /* explicit ETSNewClassInstanceExpression(ETSNewClassInstanceExpression const &other, ArenaAllocator *allocator) */
    static ir.ETSNewClassInstanceExpression Create1(es2panda_Context context, ir.ETSNewClassInstanceExpression other);
    static ir.ETSNewClassInstanceExpression Update1(es2panda_Context context, ir.ETSNewClassInstanceExpression original, ir.ETSNewClassInstanceExpression other);

    /* [[nodiscard]] ir::Expression *GetTypeRef() const noexcept */
    [get] ir.Expression GetTypeRefConst(es2panda_Context context);

    /* void SetTypeRef(ir::Expression *typeRef) */
    [set] void SetTypeRef(es2panda_Context context, ir.Expression typeRef);

    /* [[nodiscard]] ArenaVector<ir::Expression *> &GetArguments() noexcept */
    [get] sequence<ir.Expression> GetArguments(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<ir::Expression *> &GetArguments() const noexcept */
    [get] sequence<ir.Expression> GetArgumentsConst(es2panda_Context context);

    /* void SetArguments(ArenaVector<ir::Expression *> &&argumentsList) */
    [set] void SetArguments(es2panda_Context context, sequence<ir.Expression> argumentsList, u32 argumentsListLen);

    /* [[nodiscard]] checker::Signature *Signature() const noexcept */
    [get] checker.Signature SignatureConst(es2panda_Context context);

    /* void SetSignature(checker::Signature *const signature) noexcept */
    [set] void SetSignature(es2panda_Context context, checker.Signature signature);

    /* void AddToArgumentsFront(ir::Expression *expr) */
    [set] void AddToArgumentsFront(es2panda_Context context, ir.Expression expr);

    /* static bool TypeIsAllowedForInstantiation(checker::Type *type) */
    boolean TypeIsAllowedForInstantiation(es2panda_Context context, checker.Type type);
};

[Entity=Class, Es2pandaAstNodeType=142, c_type=es2panda_AstNode] interface TSAsExpression: AnnotatedExpression {

    /* explicit TSAsExpression(Expression *expression, TypeNode *typeAnnotation, bool isConst) */
    static ir.TSAsExpression Create(es2panda_Context context, ir.Expression expression, ir.TypeNode typeAnnotation, boolean isConst);
    static ir.TSAsExpression Update(es2panda_Context context, ir.TSAsExpression original, ir.Expression expression, ir.TypeNode typeAnnotation, boolean isConst);

    /* [[nodiscard]] const Expression *Expr() const noexcept */
    [get] ir.Expression ExprConst(es2panda_Context context);

    /* [[nodiscard]] Expression *Expr() noexcept */
    ir.Expression Expr(es2panda_Context context);

    /* void SetExpr(Expression *expr) noexcept */
    [set] void SetExpr(es2panda_Context context, ir.Expression expr);

    /* [[nodiscard]] bool IsConst() const noexcept */
    [get] boolean IsConstConst(es2panda_Context context);

    /* void SetUncheckedCast(bool isUncheckedCast) noexcept */
    [set] void SetUncheckedCast(es2panda_Context context, boolean isUncheckedCast);

    /* [[nodiscard]] TypeNode *TypeAnnotation() const noexcept */
    [get] ir.TypeNode TypeAnnotationConst(es2panda_Context context);

    /* void SetTsTypeAnnotation(TypeNode *const typeAnnotation) noexcept */
    [set] void SetTsTypeAnnotation(es2panda_Context context, ir.TypeNode typeAnnotation);
};

[Entity=Class, Es2pandaAstNodeType=33, c_type=es2panda_AstNode] interface ForUpdateStatement: LoopStatement {

    /* explicit ForUpdateStatement(AstNode *init, Expression *test, Expression *update, Statement *body) */
    static ir.ForUpdateStatement Create(es2panda_Context context, ir.AstNode init, ir.Expression test, ir.Expression update, ir.Statement body);
    static ir.ForUpdateStatement Update(es2panda_Context context, ir.ForUpdateStatement original, ir.AstNode init, ir.Expression test, ir.Expression update, ir.Statement body);

    /* AstNode *Init() */
    [get] ir.AstNode Init(es2panda_Context context);

    /* const AstNode *Init() const */
    [get] ir.AstNode InitConst(es2panda_Context context);

    /* void SetInit(AstNode *init) */
    [set] void SetInit(es2panda_Context context, ir.AstNode init);

    /* Expression *Test() */
    [get] ir.Expression Test(es2panda_Context context);

    /* const Expression *Test() const */
    [get] ir.Expression TestConst(es2panda_Context context);

    /* void SetTest(Expression *test) */
    [set] void SetTest(es2panda_Context context, ir.Expression test);

    /* Expression *Update() */
    [get] ir.Expression UpdateExpression(es2panda_Context context);

    /* const Expression *Update() const */
    [get] ir.Expression UpdateExpressionConst(es2panda_Context context);

    /* void SetUpdate(Expression *update) */
    [set] void SetUpdate(es2panda_Context context, ir.Expression update);

    /* Statement *Body() */
    [get] ir.Statement Body(es2panda_Context context);

    /* const Statement *Body() const */
    [get] ir.Statement BodyConst(es2panda_Context context);

    /* void SetBody(Statement *body) */
    [set] void SetBody(es2panda_Context context, ir.Statement body);
};

[Entity=Class, Es2pandaAstNodeType=76, c_type=es2panda_AstNode] interface ETSTypeReferencePart: TypeNode {

    /* explicit ETSTypeReferencePart(ir::Expression *name, ir::TSTypeParameterInstantiation *typeParams,
                                  ir::ETSTypeReferencePart *prev, ArenaAllocator *const allocator) */
    static ir.ETSTypeReferencePart Create(es2panda_Context context, ir.Expression name, ir.TSTypeParameterInstantiation typeParams, ir.ETSTypeReferencePart prev);
    static ir.ETSTypeReferencePart Update(es2panda_Context context, ir.ETSTypeReferencePart original, ir.Expression name, ir.TSTypeParameterInstantiation typeParams, ir.ETSTypeReferencePart prev);

    /* explicit ETSTypeReferencePart(ir::Expression *name, ArenaAllocator *const allocator) */
    static ir.ETSTypeReferencePart Create1(es2panda_Context context, ir.Expression name);
    static ir.ETSTypeReferencePart Update1(es2panda_Context context, ir.ETSTypeReferencePart original, ir.Expression name);

    /* ir::ETSTypeReferencePart *Previous() */
    [get] ir.ETSTypeReferencePart Previous(es2panda_Context context);

    /* const ir::ETSTypeReferencePart *Previous() const */
    [get] ir.ETSTypeReferencePart PreviousConst(es2panda_Context context);

    /* void SetPrevious(ir::ETSTypeReferencePart *prev) */
    [set] void SetPrevious(es2panda_Context context, ir.ETSTypeReferencePart prev);

    /* ir::Expression *Name() */
    [get] ir.Expression Name(es2panda_Context context);

    /* void SetName(ir::Expression *name) */
    [set] void SetName(es2panda_Context context, ir.Expression name);

    /* ir::TSTypeParameterInstantiation *TypeParams() */
    [get] ir.TSTypeParameterInstantiation TypeParams(es2panda_Context context);

    /* void SetTypeParams(ir::TSTypeParameterInstantiation *typeParams) */
    [set] void SetTypeParams(es2panda_Context context, ir.TSTypeParameterInstantiation typeParams);

    /* const ir::TSTypeParameterInstantiation *TypeParams() const */
    [get] ir.TSTypeParameterInstantiation TypeParamsConst(es2panda_Context context);

    /* const ir::Expression *Name() const */
    [get] ir.Expression NameConst(es2panda_Context context);

    /* ir::Identifier *GetIdent() */
    ir.Identifier GetIdent(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=58, c_type=es2panda_AstNode] interface ETSReExportDeclaration: Statement {

    /* explicit ETSReExportDeclaration(ETSImportDeclaration *etsImportDeclarations,
                                    const std::vector<std::string> &userPaths, util::StringView programPath,
                                    ArenaAllocator *allocator) */
    static ir.ETSReExportDeclaration Create(es2panda_Context context, ir.ETSImportDeclaration etsImportDeclarations, sequence<String> userPaths, u32 userPathsLen, String programPath);
    static ir.ETSReExportDeclaration Update(es2panda_Context context, ir.ETSReExportDeclaration original, ir.ETSImportDeclaration etsImportDeclarations, sequence<String> userPaths, u32 userPathsLen, String programPath);

    /* ETSImportDeclaration *GetETSImportDeclarations() const */
    [get] ir.ETSImportDeclaration GetETSImportDeclarationsConst(es2panda_Context context);

    /* ETSImportDeclaration *GetETSImportDeclarations() */
    [get] ir.ETSImportDeclaration GetETSImportDeclarations(es2panda_Context context);

    /* const ArenaVector<util::StringView> &GetUserPaths() const */
    [get] sequence<String> GetUserPathsConst(es2panda_Context context);

    /* util::StringView const &GetProgramPath() const */
    [get] String GetProgramPathConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=72, c_type=es2panda_AstNode] interface ETSPrimitiveType: TypeNode {

    /* explicit ETSPrimitiveType(PrimitiveType type, ArenaAllocator *const allocator) */
    static ir.ETSPrimitiveType Create(es2panda_Context context, Es2pandaPrimitiveType type);
    static ir.ETSPrimitiveType Update(es2panda_Context context, ir.ETSPrimitiveType original, Es2pandaPrimitiveType type);

    /* PrimitiveType GetPrimitiveType() const */
    [get] Es2pandaPrimitiveType GetPrimitiveTypeConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_AstNode] interface TypeNode: Expression {

    /* [[nodiscard]] virtual checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) */
    [get] checker.Type GetType(es2panda_Context context);

    /* [[nodiscard]] bool HasAnnotations() const noexcept */
    boolean HasAnnotationsConst(es2panda_Context context);

    /* void EmplaceAnnotation(AnnotationUsage *source) */
    void EmplaceAnnotation(es2panda_Context context, ir.AnnotationUsage source);

    /* void ClearAnnotations() */
    void ClearAnnotations(es2panda_Context context);

    /* void TransformAnnotations(const NodeTransformer &cb, std::string_view const transformationName) */
    void TransformAnnotations(es2panda_Context context, NodeTransformer cb, String transformationName);

    /* void IterateAnnotations(const NodeTraverser &cb) const */
    void IterateAnnotationsConst(es2panda_Context context, NodeTraverser cb);

    /* void DumpAnnotations(ir::SrcDumper *dumper) const */
    void DumpAnnotationsConst(es2panda_Context context, ir.SrcDumper dumper);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &AnnotationsForUpdate() */
    sequence<ir.AnnotationUsage> AnnotationsForUpdate(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> &Annotations() */
    sequence<ir.AnnotationUsage> Annotations(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<ir::AnnotationUsage *> const &Annotations() const */
    sequence<ir.AnnotationUsage> AnnotationsConst(es2panda_Context context);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> &&annotationList) */
    void SetAnnotations(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);

    /* void SetAnnotations(ArenaVector<ir::AnnotationUsage *> const &annotationList) */
    void SetAnnotations1(es2panda_Context context, sequence<ir.AnnotationUsage> annotationList, u32 annotationListLen);
};

[Entity=Class, Es2pandaAstNodeType=49, c_type=es2panda_AstNode] interface NewExpression: Expression {

    /* explicit NewExpression(Expression *const callee, ArenaVector<Expression *> &&arguments) */
    static ir.NewExpression Create(es2panda_Context context, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen);
    static ir.NewExpression Update(es2panda_Context context, ir.NewExpression original, ir.Expression callee, sequence<ir.Expression> arguments, u32 argumentsLen);

    /* [[nodiscard]] const Expression *Callee() const noexcept */
    [get] ir.Expression CalleeConst(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Expression *> &Arguments() const noexcept */
    [get] sequence<ir.Expression> ArgumentsConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=126, c_type=es2panda_AstNode] interface TSParameterProperty: Expression {

    /* explicit TSParameterProperty(AccessibilityOption accessibility, Expression *parameter, bool readonly, bool isStatic,
                                 bool isExport) */
    static ir.TSParameterProperty Create(es2panda_Context context, Es2pandaAccessibilityOption accessibility, ir.Expression parameter, boolean readonly_arg, boolean isStatic, boolean isExport);
    static ir.TSParameterProperty Update(es2panda_Context context, ir.TSParameterProperty original, Es2pandaAccessibilityOption accessibility, ir.Expression parameter, boolean readonly_arg, boolean isStatic, boolean isExport);

    /* AccessibilityOption Accessibility() const */
    [get] Es2pandaAccessibilityOption AccessibilityConst(es2panda_Context context);

    /* bool Readonly() const */
    [get] boolean ReadonlyConst(es2panda_Context context);

    /* bool IsStatic() const */
    [get] boolean IsStaticConst(es2panda_Context context);

    /* bool IsExport() const */
    [get] boolean IsExportConst(es2panda_Context context);

    /* const Expression *Parameter() const */
    [get] ir.Expression ParameterConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=70, c_type=es2panda_AstNode] interface ETSWildcardType: TypeNode {

    /* explicit ETSWildcardType(ir::ETSTypeReference *typeReference, ModifierFlags flags, ArenaAllocator *const allocator) */
    static ir.ETSWildcardType Create(es2panda_Context context, ir.ETSTypeReference typeReference, Es2pandaModifierFlags flags);
    static ir.ETSWildcardType Update(es2panda_Context context, ir.ETSWildcardType original, ir.ETSTypeReference typeReference, Es2pandaModifierFlags flags);

    /* ir::ETSTypeReference *TypeReference() */
    [get] ir.ETSTypeReference TypeReference(es2panda_Context context);

    /* ir::ETSTypeReference const *TypeReference() const */
    [get] ir.ETSTypeReference TypeReferenceConst(es2panda_Context context);
};

[Entity=Class, Es2pandaAstNodeType=120, c_type=es2panda_AstNode] interface TSThisType: TypeNode {

    /* explicit TSThisType(ArenaAllocator *const allocator) */
    static ir.TSThisType Create(es2panda_Context context);
    static ir.TSThisType Update(es2panda_Context context, ir.TSThisType original);
};

};  // namespace ir

namespace checker {

[Entity=Class, c_type=es2panda_Type] interface UnknownType: Type {

    /* UnknownType() */
    static checker.UnknownType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface StringLiteralType: Type {

    /* explicit StringLiteralType(util::StringView value) */
    static checker.StringLiteralType Create(es2panda_Context context, String value);

    /* const util::StringView &Value() const */
    [get] String ValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ObjectType: Type {

    /* ObjectType::ObjectTypeKind Kind() const */
    [get] Es2pandaObjectTypeKind KindConst(es2panda_Context context);

    /* virtual ArenaVector<Signature *> CallSignatures() */
    [get] sequence<checker.Signature> CallSignatures(es2panda_Context context);

    /* virtual ArenaVector<Signature *> ConstructSignatures() */
    [get] sequence<checker.Signature> ConstructSignatures(es2panda_Context context);

    /* virtual const IndexInfo *StringIndexInfo() const */
    [get] es2panda_IndexInfo StringIndexInfoConst(es2panda_Context context);

    /* virtual const IndexInfo *NumberIndexInfo() const */
    [get] es2panda_IndexInfo NumberIndexInfoConst(es2panda_Context context);

    /* virtual IndexInfo *StringIndexInfo() */
    [get] es2panda_IndexInfo StringIndexInfo(es2panda_Context context);

    /* virtual IndexInfo *NumberIndexInfo() */
    [get] es2panda_IndexInfo NumberIndexInfo(es2panda_Context context);

    /* virtual ArenaVector<varbinder::LocalVariable *> Properties() */
    [get] sequence<varbinder.LocalVariable> Properties(es2panda_Context context);

    /* ObjectDescriptor *Desc() */
    [get] es2panda_ObjectDescriptor Desc(es2panda_Context context);

    /* const ObjectDescriptor *Desc() const */
    [get] es2panda_ObjectDescriptor DescConst(es2panda_Context context);

    /* void AddProperty(varbinder::LocalVariable *prop) */
    [set] void AddProperty(es2panda_Context context, varbinder.LocalVariable prop);

    /* virtual varbinder::LocalVariable *GetProperty(const util::StringView &name,
                                                  [[maybe_unused]] bool searchInBase) const */
    varbinder.LocalVariable GetPropertyConst(es2panda_Context context, String name, boolean searchInBase);

    /* void AddCallSignature(Signature *signature) */
    [set] void AddCallSignature(es2panda_Context context, checker.Signature signature);

    /* void AddConstructSignature(Signature *signature) */
    [set] void AddConstructSignature(es2panda_Context context, checker.Signature signature);

    /* void AddObjectFlag(ObjectFlags flag) */
    [set] void AddObjectFlag(es2panda_Context context, Es2pandaObjectFlags flag);

    /* void RemoveObjectFlag(ObjectFlags flag) */
    void RemoveObjectFlag(es2panda_Context context, Es2pandaObjectFlags flag);

    /* bool HasObjectFlag(ObjectFlags flag) const */
    [get] boolean HasObjectFlagConst(es2panda_Context context, Es2pandaObjectFlags flag);

    /* static bool SignatureRelatedToSomeSignature(TypeRelation *relation, Signature *sourceSignature,
                                                ArenaVector<Signature *> *targetSignatures) */
    boolean SignatureRelatedToSomeSignature(es2panda_Context context, checker.TypeRelation relation, checker.Signature sourceSignature, sequence<checker.Signature> targetSignatures, u32 targetSignaturesLen);

    /* static bool EachSignatureRelatedToSomeSignature(TypeRelation *relation,
                                                    const ArenaVector<Signature *> &sourceSignatures,
                                                    const ArenaVector<Signature *> &targetSignatures) */
    boolean EachSignatureRelatedToSomeSignature(es2panda_Context context, checker.TypeRelation relation, sequence<checker.Signature> sourceSignatures, u32 sourceSignaturesLen, sequence<checker.Signature> targetSignatures, u32 targetSignaturesLen);

    /* bool FindPropertyAndCheckIdentical(TypeRelation *relation, ObjectType *otherObj) */
    boolean FindPropertyAndCheckIdentical(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType otherObj);

    /* bool IdenticalPropertiesHelper(TypeRelation *relation, ObjectType *otherObj) */
    boolean IdenticalPropertiesHelper(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType otherObj);

    /* void CheckExcessProperties(TypeRelation *relation, ObjectType *source) */
    void CheckExcessProperties(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType source);

    /* void AssignProperties(TypeRelation *relation, ObjectType *source) */
    void AssignProperties(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType source);

    /* void AssignSignatures(TypeRelation *relation, ObjectType *source, bool assignCallSignatures = true) */
    void AssignSignatures(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType source, boolean assignCallSignatures);

    /* void AssignIndexInfo(TypeRelation *relation, ObjectType *source, bool assignNumberInfo = true) */
    void AssignIndexInfo(es2panda_Context context, checker.TypeRelation relation, checker.ObjectType source, boolean assignNumberInfo);
};

[Entity=Class, c_type=es2panda_Type] interface TypeReference: Type {

    /* explicit TypeReference(Type **ref) */
    static checker.TypeReference Create(es2panda_Context context, sequence<checker.Type> ref);

    /* Type *Ref() */
    [get] checker.Type Ref(es2panda_Context context);

    /* const Type *Ref() const */
    [get] checker.Type RefConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface BooleanType: Type {

    /* BooleanType() */
    static checker.BooleanType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface NeverType: Type {

    /* NeverType() */
    static checker.NeverType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface NumberType: Type {

    /* NumberType() */
    static checker.NumberType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSFunctionType: Type {

    /* explicit ETSFunctionType(ETSChecker *checker, Signature *signature) */
    static checker.ETSFunctionType Create(es2panda_Context context, checker.Signature signature);

    /* explicit ETSFunctionType(ETSChecker *checker, util::StringView name, ArenaVector<Signature *> &&signatures) */
    static checker.ETSFunctionType Create1(es2panda_Context context, String name, sequence<checker.Signature> signatures, u32 signaturesLen);

    /* [[nodiscard]] ArenaVector<Signature *> &CallSignatures() */
    sequence<checker.Signature> CallSignatures(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Signature *> &CallSignatures() const */
    sequence<checker.Signature> CallSignaturesConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Signature *> &CallSignaturesOfMethodOrArrow() */
    [get] sequence<checker.Signature> CallSignaturesOfMethodOrArrow(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Signature *> &CallSignaturesOfMethodOrArrow() const */
    [get] sequence<checker.Signature> CallSignaturesOfMethodOrArrowConst(es2panda_Context context);

    /* [[nodiscard]] util::StringView Name() const */
    String NameConst(es2panda_Context context);

    /* void AddCallSignature(Signature *signature) */
    [set] void AddCallSignature(es2panda_Context context, checker.Signature signature);

    /* [[nodiscard]] Signature *FindSignature(const ir::ScriptFunction *func) const noexcept */
    [get] checker.Signature FindSignatureConst(es2panda_Context context, ir.ScriptFunction func);

    /* [[nodiscard]] Signature *FindGetter() const noexcept */
    [get] checker.Signature FindGetterConst(es2panda_Context context);

    /* [[nodiscard]] Signature *FindSetter() const noexcept */
    [get] checker.Signature FindSetterConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Signature *> CollectExtensionAccessorSigs(ArenaAllocator *allocator) */
    sequence<checker.Signature> CollectExtensionAccessorSigs(es2panda_Context context);

    /* [[nodiscard]] Signature *FirstAbstractSignature() const noexcept */
    [get] checker.Signature FirstAbstractSignatureConst(es2panda_Context context);

    /* Signature *ArrowSignature() const */
    checker.Signature ArrowSignatureConst(es2panda_Context context);

    /* ETSFunctionType *MethodToArrow(ETSChecker *checker) */
    checker.ETSFunctionType MethodToArrow(es2panda_Context context);

    /* ETSObjectType *ArrowToFunctionalInterface(ETSChecker *checker) */
    checker.ETSObjectType ArrowToFunctionalInterface(es2panda_Context context);

    /* ETSObjectType *ArrowToFunctionalInterfaceDesiredArity(ETSChecker *checker, size_t arity) */
    checker.ETSObjectType ArrowToFunctionalInterfaceDesiredArity(es2panda_Context context, u32 arity);

    /* [[nodiscard]] bool IsExtensionFunctionType() const */
    [get] boolean IsExtensionFunctionTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionAccessorType() const */
    [get] boolean IsExtensionAccessorTypeConst(es2panda_Context context);

    /* void SetHelperSignature(Signature *signature) noexcept */
    [set] void SetHelperSignature(es2panda_Context context, checker.Signature signature);

    /* const Signature *GetHelperSignature() const */
    [get] checker.Signature GetHelperSignatureConst(es2panda_Context context);

    /* Signature *GetHelperSignature() */
    [get] checker.Signature GetHelperSignature(es2panda_Context context);

    /* bool HasHelperSignature() */
    [get] boolean HasHelperSignature(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface UnionType: Type {

    /* explicit UnionType(ArenaAllocator *allocator, ArenaVector<Type *> &&constituentTypes) */
    static checker.UnionType Create(es2panda_Context context, sequence<checker.Type> constituentTypes, u32 constituentTypesLen);

    /* explicit UnionType(ArenaAllocator *allocator, ArenaVector<Type *> &constituentTypes) */
    static checker.UnionType Create1(es2panda_Context context, sequence<checker.Type> constituentTypes, u32 constituentTypesLen);

    /* const ArenaVector<Type *> &ConstituentTypes() const */
    [get] sequence<checker.Type> ConstituentTypesConst(es2panda_Context context);

    /* ArenaVector<Type *> &ConstituentTypes() */
    [get] sequence<checker.Type> ConstituentTypes(es2panda_Context context);

    /* void AddConstituentType(Type *type, TypeRelation *relation) */
    [set] void AddConstituentType(es2panda_Context context, checker.Type type, checker.TypeRelation relation);

    /* void AddConstituentFlag(TypeFlag flag) */
    [set] void AddConstituentFlag(es2panda_Context context, Es2pandaTypeFlag flag);

    /* void RemoveConstituentFlag(TypeFlag flag) */
    void RemoveConstituentFlag(es2panda_Context context, Es2pandaTypeFlag flag);

    /* bool HasConstituentFlag(TypeFlag flag) const */
    [get] boolean HasConstituentFlagConst(es2panda_Context context, Es2pandaTypeFlag flag);

    /* ArenaUnorderedMap<util::StringView, varbinder::Variable *> &CachedSyntheticProperties() */
    [get] sequence<String> CachedSyntheticProperties(es2panda_Context context, sequence<sequence<varbinder.Variable>> arenaMapValueArray);

    /* ObjectType *MergedObjectType() */
    [get] checker.ObjectType MergedObjectType(es2panda_Context context);

    /* void SetMergedObjectType(ObjectType *type) */
    [set] void SetMergedObjectType(es2panda_Context context, checker.ObjectType type);

    /* static void RemoveDuplicatedTypes(TypeRelation *relation, ArenaVector<Type *> &constituentTypes) */
    void RemoveDuplicatedTypes(es2panda_Context context, checker.TypeRelation relation, sequence<checker.Type> constituentTypes, u32 constituentTypesLen);

    /* static Type *HandleUnionType(UnionType *unionType, GlobalTypesHolder *globalTypesHolder) */
    checker.Type HandleUnionType(es2panda_Context context, checker.UnionType unionType, checker.GlobalTypesHolder globalTypesHolder);

    /* static void RemoveRedundantLiteralTypesFromUnion(UnionType *type) */
    void RemoveRedundantLiteralTypesFromUnion(es2panda_Context context, checker.UnionType type);
};

[Entity=Class, c_type=es2panda_Type] interface ETSArrayType: Type {

    /* explicit ETSArrayType(Type *elementType) */
    static checker.ETSArrayType Create(es2panda_Context context, checker.Type elementType);

    /* Type *ElementType() */
    [get] checker.Type ElementType(es2panda_Context context);

    /* const Type *ElementType() const */
    [get] checker.Type ElementTypeConst(es2panda_Context context);

    /* void SetElementType(Type *element) */
    [set] void SetElementType(es2panda_Context context, checker.Type element);
};

[Entity=Class, c_type=es2panda_Signature] interface Signature {

    /* Signature(SignatureInfo *signatureInfo, Type *returnType, ir::ScriptFunction *func = nullptr) */
    static checker.Signature Create(es2panda_Context context, es2panda_SignatureInfo signatureInfo, checker.Type returnType, ir.ScriptFunction func);

    /* [[nodiscard]] const SignatureInfo *GetSignatureInfo() const noexcept */
    [get] es2panda_SignatureInfo GetSignatureInfoConst(es2panda_Context context);

    /* [[nodiscard]] SignatureInfo *GetSignatureInfo() noexcept */
    [get] es2panda_SignatureInfo GetSignatureInfo(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Type *> &TypeParams() const noexcept */
    [get] sequence<checker.Type> TypeParamsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Type *> &TypeParams() noexcept */
    [get] sequence<checker.Type> TypeParams(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<varbinder::LocalVariable *> &Params() const noexcept */
    [get] sequence<varbinder.LocalVariable> ParamsConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<varbinder::LocalVariable *> &Params() noexcept */
    [get] sequence<varbinder.LocalVariable> Params(es2panda_Context context);

    /* [[nodiscard]] const Type *ReturnType() const noexcept */
    [get] checker.Type ReturnTypeConst(es2panda_Context context);

    /* [[nodiscard]] Type *ReturnType() noexcept */
    [get] checker.Type ReturnType(es2panda_Context context);

    /* [[nodiscard]] uint32_t MinArgCount() const noexcept */
    [get] u32 MinArgCountConst(es2panda_Context context);

    /* [[nodiscard]] size_t ArgCount() const */
    [get] u32 ArgCountConst(es2panda_Context context);

    /* void SetReturnType(Type *type) noexcept */
    [get] void SetReturnType(es2panda_Context context, checker.Type type);

    /* void SetOwner(ETSObjectType *owner) noexcept */
    [set] void SetOwner(es2panda_Context context, checker.ETSObjectType owner);

    /* void SetOwnerVar(varbinder::Variable *owner) noexcept */
    [set] void SetOwnerVar(es2panda_Context context, varbinder.Variable owner);

    /* [[nodiscard]] bool HasFunction() const noexcept */
    [get] boolean HasFunctionConst(es2panda_Context context);

    /* [[nodiscard]] ir::ScriptFunction *Function() noexcept */
    ir.ScriptFunction Function(es2panda_Context context);

    /* [[nodiscard]] const ir::ScriptFunction *Function() const noexcept */
    ir.ScriptFunction FunctionConst(es2panda_Context context);

    /* void SetInternalName(util::StringView internalName) */
    [set] void SetInternalName(es2panda_Context context, String internalName);

    /* [[nodiscard]] ETSObjectType *Owner() */
    [get] checker.ETSObjectType Owner(es2panda_Context context);

    /* [[nodiscard]] const ETSObjectType *Owner() const noexcept */
    [get] checker.ETSObjectType OwnerConst(es2panda_Context context);

    /* [[nodiscard]] varbinder::Variable *OwnerVar() noexcept */
    [get] varbinder.Variable OwnerVar(es2panda_Context context);

    /* [[nodiscard]] const varbinder::LocalVariable *RestVar() const noexcept */
    [get] varbinder.LocalVariable RestVarConst(es2panda_Context context);

    /* [[nodiscard]] varbinder::LocalVariable *RestVar() noexcept */
    [get] varbinder.LocalVariable RestVar(es2panda_Context context);

    /* [[nodiscard]] uint8_t ProtectionFlag() const noexcept */
    u8 ProtectionFlagConst(es2panda_Context context);

    /* [[nodiscard]] SignatureFlags Flags() const noexcept */
    [get] Es2pandaSignatureFlags FlagsConst(es2panda_Context context);

    /* void AddSignatureFlag(SignatureFlags const flag) noexcept */
    [set] void AddSignatureFlag(es2panda_Context context, Es2pandaSignatureFlags flag);

    /* void RemoveSignatureFlag(SignatureFlags const flag) noexcept */
    void RemoveSignatureFlag(es2panda_Context context, Es2pandaSignatureFlags flag);

    /* [[nodiscard]] bool HasSignatureFlag(SignatureFlags const flag) const noexcept */
    [get] boolean HasSignatureFlagConst(es2panda_Context context, Es2pandaSignatureFlags flag);

    /* [[nodiscard]] bool HasRestParameter() const noexcept */
    [get] boolean HasRestParameterConst(es2panda_Context context);

    /* void SetRestVar(varbinder::LocalVariable *restVar) */
    [set] void SetRestVar(es2panda_Context context, varbinder.LocalVariable restVar);

    /* [[nodiscard]] bool IsFinal() const noexcept */
    [get] boolean IsFinalConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionFunction() const noexcept */
    [get] boolean IsExtensionFunctionConst(es2panda_Context context);

    /* [[nodiscard]] bool IsExtensionAccessor() const noexcept */
    [get] boolean IsExtensionAccessorConst(es2panda_Context context);

    /* [[nodiscard]] util::StringView InternalName() const */
    String InternalNameConst(es2panda_Context context);

    /* [[nodiscard]] Signature *Copy(ArenaAllocator *allocator, TypeRelation *relation,
                                  GlobalTypesHolder *globalTypes) const */
    checker.Signature CopyConst(es2panda_Context context, checker.TypeRelation relation, checker.GlobalTypesHolder globalTypes);

    /* std::string ToString() const */
    String ToStringConst(es2panda_Context context);

    /* void IsSubtypeOf(TypeRelation *relation, Signature *super) */
    void IsSubtypeOf(es2panda_Context context, checker.TypeRelation relation, checker.Signature super);

    /* void AssignmentTarget(TypeRelation *relation, Signature *source) */
    void AssignmentTarget(es2panda_Context context, checker.TypeRelation relation, checker.Signature source);

    /* [[nodiscard]] Signature *ToArrowSignature(ETSChecker *checker) */
    checker.Signature ToArrowSignature(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSBigIntType: ETSObjectType {

    /* explicit ETSBigIntType(ArenaAllocator *allocator, [[maybe_unused]] ETSObjectType *super) */
    static checker.ETSBigIntType Create(es2panda_Context context, checker.ETSObjectType super);

    /* explicit ETSBigIntType(ArenaAllocator *allocator, ETSObjectType *super, TypeRelation *relation,
                           util::StringView value) */
    static checker.ETSBigIntType Create1(es2panda_Context context, checker.ETSObjectType super, checker.TypeRelation relation, String value);

    /* util::StringView GetValue() const */
    [get] String GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface AnyType: Type {

    /* AnyType() */
    static checker.AnyType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_GlobalTypesHolder] interface GlobalTypesHolder {

    /* explicit GlobalTypesHolder(ArenaAllocator *allocator) */
    static checker.GlobalTypesHolder Create(es2panda_Context context);

    /* void AddETSEscompatLayer() */
    [set] void AddETSEscompatLayer(es2panda_Context context);

    /* void AddEtsSpecificTypes(ArenaAllocator *allocator) */
    [set] void AddEtsSpecificTypes(es2panda_Context context);

    /* void AddEtsSpecificBuiltinTypes() */
    [set] void AddEtsSpecificBuiltinTypes(es2panda_Context context);

    /* void AddTSSpecificTypes(ArenaAllocator *allocator) */
    [set] void AddTSSpecificTypes(es2panda_Context context);

    /* void AddFunctionTypes(ArenaAllocator *allocator) */
    [set] void AddFunctionTypes(es2panda_Context context);

    /* void AddTupleTypes(ArenaAllocator *allocator) */
    [set] void AddTupleTypes(es2panda_Context context);

    /* Type *GlobalNumberType() */
    checker.Type GlobalNumberType(es2panda_Context context);

    /* Type *GlobalAnyType() */
    checker.Type GlobalAnyType(es2panda_Context context);

    /* Type *GlobalStringType() */
    checker.Type GlobalStringType(es2panda_Context context);

    /* Type *GlobalBooleanType() */
    checker.Type GlobalBooleanType(es2panda_Context context);

    /* Type *GlobalVoidType() */
    checker.Type GlobalVoidType(es2panda_Context context);

    /* Type *GlobalNullType() */
    checker.Type GlobalNullType(es2panda_Context context);

    /* Type *GlobalUndefinedType() */
    checker.Type GlobalUndefinedType(es2panda_Context context);

    /* Type *GlobalUnknownType() */
    checker.Type GlobalUnknownType(es2panda_Context context);

    /* Type *GlobalNeverType() */
    checker.Type GlobalNeverType(es2panda_Context context);

    /* Type *GlobalNonPrimitiveType() */
    checker.Type GlobalNonPrimitiveType(es2panda_Context context);

    /* Type *GlobalBigintType() */
    checker.Type GlobalBigintType(es2panda_Context context);

    /* Type *GlobalFalseType() */
    checker.Type GlobalFalseType(es2panda_Context context);

    /* Type *GlobalTrueType() */
    checker.Type GlobalTrueType(es2panda_Context context);

    /* Type *GlobalNumberOrBigintType() */
    checker.Type GlobalNumberOrBigintType(es2panda_Context context);

    /* Type *GlobalStringOrNumberType() */
    checker.Type GlobalStringOrNumberType(es2panda_Context context);

    /* Type *GlobalZeroType() */
    checker.Type GlobalZeroType(es2panda_Context context);

    /* Type *GlobalEmptyStringType() */
    checker.Type GlobalEmptyStringType(es2panda_Context context);

    /* Type *GlobalZeroBigintType() */
    checker.Type GlobalZeroBigintType(es2panda_Context context);

    /* Type *GlobalPrimitiveType() */
    checker.Type GlobalPrimitiveType(es2panda_Context context);

    /* Type *GlobalEmptyTupleType() */
    checker.Type GlobalEmptyTupleType(es2panda_Context context);

    /* Type *GlobalEmptyObjectType() */
    checker.Type GlobalEmptyObjectType(es2panda_Context context);

    /* Type *GlobalResolvingReturnType() */
    checker.Type GlobalResolvingReturnType(es2panda_Context context);

    /* Type *GlobalErrorType() */
    checker.Type GlobalErrorType(es2panda_Context context);

    /* Type *GlobalByteType() */
    checker.Type GlobalByteType(es2panda_Context context);

    /* Type *GlobalShortType() */
    checker.Type GlobalShortType(es2panda_Context context);

    /* Type *GlobalIntType() */
    checker.Type GlobalIntType(es2panda_Context context);

    /* Type *GlobalLongType() */
    checker.Type GlobalLongType(es2panda_Context context);

    /* Type *GlobalFloatType() */
    checker.Type GlobalFloatType(es2panda_Context context);

    /* Type *GlobalDoubleType() */
    checker.Type GlobalDoubleType(es2panda_Context context);

    /* Type *GlobalCharType() */
    checker.Type GlobalCharType(es2panda_Context context);

    /* Type *GlobalETSBooleanType() */
    checker.Type GlobalETSBooleanType(es2panda_Context context);

    /* Type *GlobalETSStringLiteralType() */
    checker.Type GlobalETSStringLiteralType(es2panda_Context context);

    /* Type *GlobalETSVoidType() */
    checker.Type GlobalETSVoidType(es2panda_Context context);

    /* Type *GlobalETSObjectType() */
    checker.Type GlobalETSObjectType(es2panda_Context context);

    /* Type *GlobalETSNullType() */
    checker.Type GlobalETSNullType(es2panda_Context context);

    /* Type *GlobalETSUndefinedType() */
    checker.Type GlobalETSUndefinedType(es2panda_Context context);

    /* Type *GlobalETSAnyType() */
    checker.Type GlobalETSAnyType(es2panda_Context context);

    /* Type *GlobalETSRelaxedAnyType() */
    checker.Type GlobalETSRelaxedAnyType(es2panda_Context context);

    /* Type *GlobalETSNeverType() */
    checker.Type GlobalETSNeverType(es2panda_Context context);

    /* Type *GlobalETSUnionUndefinedNull() */
    checker.Type GlobalETSUnionUndefinedNull(es2panda_Context context);

    /* Type *GlobalETSUnionUndefinedNullObject() */
    checker.Type GlobalETSUnionUndefinedNullObject(es2panda_Context context);

    /* Type *GlobalWildcardType() */
    checker.Type GlobalWildcardType(es2panda_Context context);

    /* Type *GlobalETSBooleanBuiltinType() */
    checker.Type GlobalETSBooleanBuiltinType(es2panda_Context context);

    /* Type *GlobalByteBuiltinType() */
    checker.Type GlobalByteBuiltinType(es2panda_Context context);

    /* Type *GlobalClassBuiltinType() */
    checker.Type GlobalClassBuiltinType(es2panda_Context context);

    /* Type *GlobalCharBuiltinType() */
    checker.Type GlobalCharBuiltinType(es2panda_Context context);

    /* Type *GlobalComparableBuiltinType() */
    checker.Type GlobalComparableBuiltinType(es2panda_Context context);

    /* Type *GlobalConsoleBuiltinType() */
    checker.Type GlobalConsoleBuiltinType(es2panda_Context context);

    /* Type *GlobalDoubleBuiltinType() */
    checker.Type GlobalDoubleBuiltinType(es2panda_Context context);

    /* Type *GlobalExceptionBuiltinType() */
    checker.Type GlobalExceptionBuiltinType(es2panda_Context context);

    /* Type *GlobalFloatBuiltinType() */
    checker.Type GlobalFloatBuiltinType(es2panda_Context context);

    /* Type *GlobalFloatingBuiltinType() */
    checker.Type GlobalFloatingBuiltinType(es2panda_Context context);

    /* Type *GlobalIntegerBuiltinType() */
    checker.Type GlobalIntegerBuiltinType(es2panda_Context context);

    /* Type *GlobalIntegralBuiltinType() */
    checker.Type GlobalIntegralBuiltinType(es2panda_Context context);

    /* Type *GlobalLongBuiltinType() */
    checker.Type GlobalLongBuiltinType(es2panda_Context context);

    /* Type *GlobalNumericBuiltinType() */
    checker.Type GlobalNumericBuiltinType(es2panda_Context context);

    /* Type *GlobalErrorBuiltinType() */
    checker.Type GlobalErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalRuntimeBuiltinType() */
    checker.Type GlobalRuntimeBuiltinType(es2panda_Context context);

    /* Type *GlobalShortBuiltinType() */
    checker.Type GlobalShortBuiltinType(es2panda_Context context);

    /* Type *GlobalStackTraceElementBuiltinType() */
    checker.Type GlobalStackTraceElementBuiltinType(es2panda_Context context);

    /* Type *GlobalStackTraceBuiltinType() */
    checker.Type GlobalStackTraceBuiltinType(es2panda_Context context);

    /* Type *GlobalArrayIndexOutOfBoundsErrorBuiltinType() */
    checker.Type GlobalArrayIndexOutOfBoundsErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalArithmeticErrorBuiltinType() */
    checker.Type GlobalArithmeticErrorBuiltinType(es2panda_Context context);

    /* [[nodiscard]] Type *GlobalClassCastErrorBuiltinType() const noexcept */
    checker.Type GlobalClassCastErrorBuiltinTypeConst(es2panda_Context context);

    /* Type *GlobalETSStringBuiltinType() */
    checker.Type GlobalETSStringBuiltinType(es2panda_Context context);

    /* Type *GlobalETSBigIntBuiltinType() */
    checker.Type GlobalETSBigIntBuiltinType(es2panda_Context context);

    /* Type *GlobalETSBigIntLiteralType() */
    checker.Type GlobalETSBigIntLiteralType(es2panda_Context context);

    /* Type *GlobalStringBuilderBuiltinType() */
    checker.Type GlobalStringBuilderBuiltinType(es2panda_Context context);

    /* Type *GlobalTypeBuiltinType() */
    checker.Type GlobalTypeBuiltinType(es2panda_Context context);

    /* Type *GlobalTypesBuiltinType() */
    checker.Type GlobalTypesBuiltinType(es2panda_Context context);

    /* Type *GlobalPromiseBuiltinType() */
    checker.Type GlobalPromiseBuiltinType(es2panda_Context context);

    /* Type *GlobalPromiseLikeBuiltinType() */
    checker.Type GlobalPromiseLikeBuiltinType(es2panda_Context context);

    /* Type *GlobalFunctionBuiltinType() */
    checker.Type GlobalFunctionBuiltinType(es2panda_Context context);

    /* Type *GlobalBoxBuiltinType() */
    checker.Type GlobalBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalBooleanBoxBuiltinType() */
    checker.Type GlobalBooleanBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalByteBoxBuiltinType() */
    checker.Type GlobalByteBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalCharBoxBuiltinType() */
    checker.Type GlobalCharBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalShortBoxBuiltinType() */
    checker.Type GlobalShortBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalIntBoxBuiltinType() */
    checker.Type GlobalIntBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalLongBoxBuiltinType() */
    checker.Type GlobalLongBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalFloatBoxBuiltinType() */
    checker.Type GlobalFloatBoxBuiltinType(es2panda_Context context);

    /* Type *GlobalDoubleBoxBuiltinType() */
    checker.Type GlobalDoubleBoxBuiltinType(es2panda_Context context);

    /* size_t VariadicFunctionTypeThreshold() */
    u32 VariadicFunctionTypeThreshold(es2panda_Context context);

    /* Type *GlobalFunctionBuiltinType(size_t nargs, bool hasRest) */
    checker.Type GlobalFunctionBuiltinType1(es2panda_Context context, u32 nargs, boolean hasRest);

    /* Type *GlobalLambdaBuiltinType(size_t nargs, bool hasRest) */
    checker.Type GlobalLambdaBuiltinType(es2panda_Context context, u32 nargs, boolean hasRest);

    /* Type *GlobalTupleBuiltinType(size_t nargs) */
    checker.Type GlobalTupleBuiltinType(es2panda_Context context, u32 nargs);

    /* size_t VariadicTupleTypeThreshold() */
    u32 VariadicTupleTypeThreshold(es2panda_Context context);

    /* Type *GlobalArrayBuiltinType() */
    checker.Type GlobalArrayBuiltinType(es2panda_Context context);

    /* Type *GlobalReadonlyArray() */
    checker.Type GlobalReadonlyArray(es2panda_Context context);

    /* Type *GlobalAssertionErrorBuiltinType() */
    checker.Type GlobalAssertionErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalDivideByZeroErrorBuiltinType() */
    checker.Type GlobalDivideByZeroErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalNullPointerErrorBuiltinType() */
    checker.Type GlobalNullPointerErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalUncaughtExceptionErrorBuiltinType() */
    checker.Type GlobalUncaughtExceptionErrorBuiltinType(es2panda_Context context);

    /* Type *GlobalMapBuiltinType() */
    checker.Type GlobalMapBuiltinType(es2panda_Context context);

    /* Type *GlobalRecordBuiltinType() */
    checker.Type GlobalRecordBuiltinType(es2panda_Context context);

    /* Type *GlobalRegExpBuiltinType() */
    checker.Type GlobalRegExpBuiltinType(es2panda_Context context);

    /* Type *GlobalSetBuiltinType() */
    checker.Type GlobalSetBuiltinType(es2panda_Context context);

    /* Type *GlobalTypeError() */
    checker.Type GlobalTypeError(es2panda_Context context);

    /* void InitializeBuiltin(util::StringView name, Type *type) */
    void InitializeBuiltin(es2panda_Context context, String name, checker.Type type);

    /* Signature *FindExtensionSetterInMap(util::StringView name, ETSObjectType *type) */
    [get] checker.Signature FindExtensionSetterInMap(es2panda_Context context, String name, checker.ETSObjectType type);

    /* Signature *FindExtensionGetterInMap(util::StringView name, ETSObjectType *type) */
    [get] checker.Signature FindExtensionGetterInMap(es2panda_Context context, String name, checker.ETSObjectType type);

    /* void InsertExtensionSetterToMap(util::StringView name, ETSObjectType *type, Signature *sig) */
    void InsertExtensionSetterToMap(es2panda_Context context, String name, checker.ETSObjectType type, checker.Signature sig);

    /* void InsertExtensionGetterToMap(util::StringView name, ETSObjectType *type, Signature *sig) */
    void InsertExtensionGetterToMap(es2panda_Context context, String name, checker.ETSObjectType type, checker.Signature sig);
};

[Entity=Class, c_type=es2panda_Type] interface LongType: Type {

    /* LongType() */
    static checker.LongType Create(es2panda_Context context);

    /* explicit LongType(UType value) */
    static checker.LongType Create1(es2panda_Context context, i64 value);

    /* UType GetValue() const */
    [get] i64 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface BigintLiteralType: Type {

    /* BigintLiteralType(util::StringView value, bool negative) */
    static checker.BigintLiteralType Create(es2panda_Context context, String value, boolean negative);

    /* const util::StringView &Value() const */
    [get] String ValueConst(es2panda_Context context);

    /* bool Negative() const */
    [get] boolean NegativeConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSAsyncFuncReturnType: ETSObjectType {

    /* ETSAsyncFuncReturnType(ArenaAllocator *allocator, TypeRelation *relation, ETSObjectType *promiseType) */
    static checker.ETSAsyncFuncReturnType Create(es2panda_Context context, checker.TypeRelation relation, checker.ETSObjectType promiseType);

    /* const Type *GetPromiseTypeArg() const */
    [get] checker.Type GetPromiseTypeArgConst(es2panda_Context context);

    /* Type *GetPromiseTypeArg() */
    [get] checker.Type GetPromiseTypeArg(es2panda_Context context);

    /* [[nodiscard]] const Type *PromiseType() const noexcept */
    [get] checker.Type PromiseTypeConst(es2panda_Context context);

    /* [[nodiscard]] Type *PromiseType() noexcept */
    [get] checker.Type PromiseType(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface VoidType: Type {

    /* VoidType() */
    static checker.VoidType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface DoubleType: Type {

    /* DoubleType() */
    static checker.DoubleType Create(es2panda_Context context);

    /* explicit DoubleType(UType value) */
    static checker.DoubleType Create1(es2panda_Context context, f64 value);

    /* UType GetValue() const */
    [get] f64 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSExtensionFuncHelperType: Type {

    /* ETSExtensionFuncHelperType(ETSFunctionType *classMethodType, ETSFunctionType *extensionFunctionType) */
    static checker.ETSExtensionFuncHelperType Create(es2panda_Context context, checker.ETSFunctionType classMethodType, checker.ETSFunctionType extensionFunctionType);

    /* ETSFunctionType *ClassMethodType() */
    [get] checker.ETSFunctionType ClassMethodType(es2panda_Context context);

    /* ETSFunctionType *ExtensionMethodType() */
    [get] checker.ETSFunctionType ExtensionMethodType(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface NullType: Type {

    /* NullType() */
    static checker.NullType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSVoidType: Type {

    /* ETSVoidType() */
    static checker.ETSVoidType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSNonNullishType: Type {

    /* explicit ETSNonNullishType(ETSTypeParameter *tparam) */
    static checker.ETSNonNullishType Create(es2panda_Context context, checker.ETSTypeParameter tparam);

    /* ETSTypeParameter *GetUnderlying() const */
    [get] checker.ETSTypeParameter GetUnderlyingConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface BigintType: Type {

    /* BigintType() */
    static checker.BigintType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSStringType: ETSObjectType {

    /* explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super) */
    static checker.ETSStringType Create(es2panda_Context context, checker.ETSObjectType super);

    /* explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super, TypeRelation *relation) */
    static checker.ETSStringType Create1(es2panda_Context context, checker.ETSObjectType super, checker.TypeRelation relation);

    /* explicit ETSStringType(ArenaAllocator *allocator, ETSObjectType *super, TypeRelation *relation,
                           util::StringView value) */
    static checker.ETSStringType Create2(es2panda_Context context, checker.ETSObjectType super, checker.TypeRelation relation, String value);

    /* util::StringView GetValue() const */
    [get] String GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface TypeParameter: Type {

    /* TypeParameter(Type *constraint, Type *defaultType) */
    static checker.TypeParameter Create(es2panda_Context context, checker.Type constraint, checker.Type defaultType);

    /* const Type *ConstraintType() const */
    [get] checker.Type ConstraintTypeConst(es2panda_Context context);

    /* Type *DefaultType() */
    [get] checker.Type DefaultType(es2panda_Context context);

    /* Type **DefaultTypeRef() */
    [get] sequence<checker.Type> DefaultTypeRef(es2panda_Context context);

    /* void SetDefaultType(Type *type) */
    [set] void SetDefaultType(es2panda_Context context, checker.Type type);
};

[Entity=Class, c_type=es2panda_Type] interface IntType: Type {

    /* IntType() */
    static checker.IntType Create(es2panda_Context context);

    /* explicit IntType(UType value) */
    static checker.IntType Create1(es2panda_Context context, i32 value);

    /* UType GetValue() const */
    [get] i32 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface NumberLiteralType: Type {

    /* explicit NumberLiteralType(double value) */
    static checker.NumberLiteralType Create(es2panda_Context context, f64 value);

    /* double Value() const */
    [get] f64 ValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSEnumType: ETSObjectType {

    /* Type *Underlying() */
    checker.Type Underlying(es2panda_Context context);

    /* Type const *Underlying() const */
    checker.Type UnderlyingConst(es2panda_Context context);

    /* bool NodeIsEnumLiteral(ir::Expression *node) const */
    boolean NodeIsEnumLiteralConst(es2panda_Context context, ir.Expression node);

    /* [[nodiscard]] Type *EnumAnnotedType() noexcept */
    [get] checker.Type EnumAnnotedType(es2panda_Context context);

    /* void SetEnumType(ir::TypeNode *typeNode, ETSChecker *checker) noexcept */
    [set] void SetEnumType(es2panda_Context context, ir.TypeNode typeNode);

    /* [[nodiscard]] const Type *EnumAnnotedType() const noexcept */
    [get] checker.Type EnumAnnotedTypeConst(es2panda_Context context);

    /* virtual bool CheckBuiltInType(const ETSChecker *checker, ETSObjectFlags flag) const noexcept = 0 */
    boolean CheckBuiltInTypeConst(es2panda_Context context, Es2pandaETSObjectFlags flag);

    /* Type *GetBaseEnumElementType(ETSChecker *checker) */
    checker.Type GetBaseEnumElementType(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSNumericEnumType: ETSEnumType {

    /* explicit ETSNumericEnumType(ArenaAllocator *allocator, util::StringView name, util::StringView internalName,
                                ir::AstNode *declNode, TypeRelation *relation) */
    static checker.ETSNumericEnumType Create(es2panda_Context context, String name, String internalName, ir.AstNode declNode, checker.TypeRelation relation);

    /* [[nodiscard]] bool NonAnnotedHasDouble() const */
    boolean NonAnnotedHasDoubleConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSStringEnumType: ETSEnumType {

    /* explicit ETSStringEnumType(ArenaAllocator *allocator, util::StringView name, util::StringView internalName,
                               ir::AstNode *declNode, TypeRelation *relation) */
    static checker.ETSStringEnumType Create(es2panda_Context context, String name, String internalName, ir.AstNode declNode, checker.TypeRelation relation);
};

[Entity=Class, c_type=es2panda_Type] interface CharType: Type {

    /* CharType() */
    static checker.CharType Create(es2panda_Context context);

    /* explicit CharType(UType value) */
    static checker.CharType Create1(es2panda_Context context, i16 value);

    /* UType GetValue() const */
    [get] i16 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface UndefinedType: Type {

    /* UndefinedType() */
    static checker.UndefinedType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface StringType: Type {

    /* StringType() */
    static checker.StringType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface NonPrimitiveType: Type {

    /* NonPrimitiveType() */
    static checker.NonPrimitiveType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSNullType: Type {

    /* ETSNullType() */
    static checker.ETSNullType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSUndefinedType: Type {

    /* ETSUndefinedType() */
    static checker.ETSUndefinedType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface Type {

    /* bool IsETSResizableArrayType() const */
    boolean IsETSResizableArrayTypeConst(es2panda_Context context);

    /* bool IsETSReadonlyArrayType() const */
    boolean IsETSReadonlyArrayTypeConst(es2panda_Context context);

    /* bool IsETSStringType() const */
    boolean IsETSStringTypeConst(es2panda_Context context);

    /* bool IsETSCharType() const */
    boolean IsETSCharTypeConst(es2panda_Context context);

    /* bool IsETSBigIntType() const */
    boolean IsETSBigIntTypeConst(es2panda_Context context);

    /* bool IsETSArrowType() const */
    boolean IsETSArrowTypeConst(es2panda_Context context);

    /* bool IsETSMethodType() const */
    boolean IsETSMethodTypeConst(es2panda_Context context);

    /* bool IsETSRelaxedAnyType() const */
    boolean IsETSRelaxedAnyTypeConst(es2panda_Context context);

    /* bool IsETSPrimitiveType() const */
    boolean IsETSPrimitiveTypeConst(es2panda_Context context);

    /* bool IsETSReferenceType() const */
    boolean IsETSReferenceTypeConst(es2panda_Context context);

    /* bool IsETSAsyncFuncReturnType() const */
    boolean IsETSAsyncFuncReturnTypeConst(es2panda_Context context);

    /* bool IsETSUnboxableObject() const */
    boolean IsETSUnboxableObjectConst(es2panda_Context context);

    /* bool IsETSPrimitiveOrEnumType() const */
    boolean IsETSPrimitiveOrEnumTypeConst(es2panda_Context context);

    /* bool PossiblyETSNull() const */
    boolean PossiblyETSNullConst(es2panda_Context context);

    /* bool PossiblyETSUndefined() const */
    boolean PossiblyETSUndefinedConst(es2panda_Context context);

    /* bool PossiblyETSNullish() const */
    boolean PossiblyETSNullishConst(es2panda_Context context);

    /* bool DefinitelyETSNullish() const */
    boolean DefinitelyETSNullishConst(es2panda_Context context);

    /* bool DefinitelyNotETSNullish() const */
    boolean DefinitelyNotETSNullishConst(es2panda_Context context);

    /* bool PossiblyETSString() const */
    boolean PossiblyETSStringConst(es2panda_Context context);

    /* bool PossiblyETSValueTyped() const */
    boolean PossiblyETSValueTypedConst(es2panda_Context context);

    /* bool PossiblyETSValueTypedExceptNullish() const */
    boolean PossiblyETSValueTypedExceptNullishConst(es2panda_Context context);

    /* bool PossiblyInForeignDomain() const */
    boolean PossiblyInForeignDomainConst(es2panda_Context context);

    /* ETSStringType *AsETSStringType() */
    checker.ETSStringType AsETSStringType(es2panda_Context context);

    /* const ETSStringType *AsETSStringType() const */
    checker.ETSStringType AsETSStringTypeConst(es2panda_Context context);

    /* const ETSBigIntType *AsETSBigIntType() const */
    checker.ETSBigIntType AsETSBigIntTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsBuiltinNumeric() const noexcept */
    boolean IsBuiltinNumericConst(es2panda_Context context);

    /* ETSAsyncFuncReturnType *AsETSAsyncFuncReturnType() */
    checker.ETSAsyncFuncReturnType AsETSAsyncFuncReturnType(es2panda_Context context);

    /* const ETSAsyncFuncReturnType *AsETSAsyncFuncReturnType() const */
    checker.ETSAsyncFuncReturnType AsETSAsyncFuncReturnTypeConst(es2panda_Context context);

    /* bool IsConstantType() const */
    [get] boolean IsConstantTypeConst(es2panda_Context context);

    /* bool IsAnyETSArrayOrTupleType() const */
    [get] boolean IsAnyETSArrayOrTupleTypeConst(es2panda_Context context);

    /* TypeFlag TypeFlags() const */
    [get] Es2pandaTypeFlag TypeFlagsConst(es2panda_Context context);

    /* bool HasTypeFlag(TypeFlag typeFlag) const */
    [get] boolean HasTypeFlagConst(es2panda_Context context, Es2pandaTypeFlag typeFlag);

    /* void AddTypeFlag(TypeFlag typeFlag) */
    [set] void AddTypeFlag(es2panda_Context context, Es2pandaTypeFlag typeFlag);

    /* void RemoveTypeFlag(TypeFlag typeFlag) */
    void RemoveTypeFlag(es2panda_Context context, Es2pandaTypeFlag typeFlag);

    /* uint32_t Id() const */
    [get] u32 IdConst(es2panda_Context context);

    /* void SetVariable(varbinder::Variable *variable) */
    [set] void SetVariable(es2panda_Context context, varbinder.Variable variable);

    /* varbinder::Variable *Variable() */
    [get] varbinder.Variable Variable(es2panda_Context context);

    /* const varbinder::Variable *Variable() const */
    [get] varbinder.Variable VariableConst(es2panda_Context context);

    /* bool IsLambdaObject() const */
    boolean IsLambdaObjectConst(es2panda_Context context);

    /* [[nodiscard]] std::string ToString() const */
    String ToStringConst(es2panda_Context context);

    /* [[nodiscard]] std::string ToStringPrecise() const */
    String ToStringPreciseConst(es2panda_Context context);

    /* std::string ToStringAsSrc() const */
    String ToStringAsSrcConst(es2panda_Context context);

    /* virtual TypeFacts GetTypeFacts() const */
    Es2pandaTypeFacts GetTypeFactsConst(es2panda_Context context);

    /* std::string ToAssemblerType() const */
    String ToAssemblerTypeConst(es2panda_Context context);

    /* std::string ToAssemblerTypeWithRank() const */
    String ToAssemblerTypeWithRankConst(es2panda_Context context);

    /* virtual uint32_t Rank() const */
    [get] u32 RankConst(es2panda_Context context);

    /* virtual void Identical(TypeRelation *relation, Type *other) */
    void Identical(es2panda_Context context, checker.TypeRelation relation, checker.Type other);

    /* virtual void AssignmentTarget(TypeRelation *relation, Type *source) = 0 */
    void AssignmentTarget(es2panda_Context context, checker.TypeRelation relation, checker.Type source);

    /* virtual bool AssignmentSource(TypeRelation *relation, Type *target) */
    boolean AssignmentSource(es2panda_Context context, checker.TypeRelation relation, checker.Type target);

    /* virtual void Compare(TypeRelation *relation, Type *other) */
    void Compare(es2panda_Context context, checker.TypeRelation relation, checker.Type other);

    /* virtual void Cast(TypeRelation *relation, Type *target) */
    void Cast(es2panda_Context context, checker.TypeRelation relation, checker.Type target);

    /* virtual void CastTarget(TypeRelation *relation, Type *source) */
    void CastTarget(es2panda_Context context, checker.TypeRelation relation, checker.Type source);

    /* virtual void IsSupertypeOf(TypeRelation *relation, Type *source) */
    void IsSupertypeOf(es2panda_Context context, checker.TypeRelation relation, checker.Type source);

    /* virtual void IsSubtypeOf(TypeRelation *relation, Type *target) */
    void IsSubtypeOf(es2panda_Context context, checker.TypeRelation relation, checker.Type target);

    /* virtual Type *AsSuper(Checker *checker, varbinder::Variable *sourceVar) */
    checker.Type AsSuper(es2panda_Context context, varbinder.Variable sourceVar);

    /* virtual void CheckVarianceRecursively([[maybe_unused]] TypeRelation *relation,
                                          [[maybe_unused]] VarianceFlag varianceFlag) */
    void CheckVarianceRecursively(es2panda_Context context, checker.TypeRelation relation, Es2pandaVarianceFlag varianceFlag);

    /* virtual Type *Instantiate(ArenaAllocator *allocator, TypeRelation *relation, GlobalTypesHolder *globalTypes) */
    checker.Type Instantiate(es2panda_Context context, checker.TypeRelation relation, checker.GlobalTypesHolder globalTypes);

    /* [[nodiscard]] virtual Type *Clone(Checker *checker) */
    checker.Type Clone(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSTupleType: Type {

    /* explicit ETSTupleType(ETSChecker *checker, ArenaVector<Type *> &&typeList) */
    static checker.ETSTupleType Create(es2panda_Context context, sequence<checker.Type> typeList, u32 typeListLen);

    /* [[nodiscard]] TupleSizeType GetTupleSize() const */
    [get] u32 GetTupleSizeConst(es2panda_Context context);

    /* [[nodiscard]] ArenaVector<Type *> const &GetTupleTypesList() const */
    [get] sequence<checker.Type> GetTupleTypesListConst(es2panda_Context context);

    /* [[nodiscard]] ETSObjectType *GetWrapperType() const */
    [get] checker.ETSObjectType GetWrapperTypeConst(es2panda_Context context);

    /* [[nodiscard]] Type *GetTypeAtIndex(TupleSizeType index) const */
    checker.Type GetTypeAtIndexConst(es2panda_Context context, u32 index);
};

[Entity=Class, c_type=es2panda_TypeRelation] interface TypeRelation {

    /* explicit TypeRelation(Checker *checker) */
    static checker.TypeRelation Create(es2panda_Context context);

    /* bool IsTrue() const */
    [get] boolean IsTrueConst(es2panda_Context context);

    /* bool IsError() const */
    [get] boolean IsErrorConst(es2panda_Context context);

    /* bool NoReturnTypeCheck() const */
    [get] boolean NoReturnTypeCheckConst(es2panda_Context context);

    /* bool DirectReturn() const */
    [get] boolean DirectReturnConst(es2panda_Context context);

    /* bool InAssignmentContext() const */
    [get] boolean InAssignmentContextConst(es2panda_Context context);

    /* bool IgnoreTypeParameters() const */
    [get] boolean IgnoreTypeParametersConst(es2panda_Context context);

    /* [[nodiscard]] bool InCastingContext() const noexcept */
    [get] boolean InCastingContextConst(es2panda_Context context);

    /* [[nodiscard]] bool UncheckedCast() const noexcept */
    [get] boolean UncheckedCastConst(es2panda_Context context);

    /* [[nodiscard]] bool NoThrowGenericTypeAlias() const noexcept */
    [get] boolean NoThrowGenericTypeAliasConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOverridingCheck() const noexcept */
    [get] boolean IsOverridingCheckConst(es2panda_Context context);

    /* [[nodiscard]] bool IsBridgeCheck() const noexcept */
    [get] boolean IsBridgeCheckConst(es2panda_Context context);

    /* [[nodiscard]] TypeRelationFlag GetTypeRelationFlags() const noexcept */
    [get] Es2pandaTypeRelationFlag GetTypeRelationFlagsConst(es2panda_Context context);

    /* void SetChecker(Checker *checker) */
    [set] void SetChecker(es2panda_Context context);

    /* ir::Expression *GetNode() const */
    [get] ir.Expression GetNodeConst(es2panda_Context context);

    /* void IncreaseTypeRecursionCount(Type *const type) */
    void IncreaseTypeRecursionCount(es2panda_Context context, checker.Type type);

    /* bool IsAtTypeDepthLimit(Type *const type) */
    boolean IsAtTypeDepthLimit(es2panda_Context context, checker.Type type);

    /* void DecreaseTypeRecursionCount(Type *const type) */
    void DecreaseTypeRecursionCount(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] bool CheckTypeParameterConstraints(ArenaVector<Type *> const &typeParameters1,
                                                     ArenaVector<Type *> const &typeParameters2) */
    boolean CheckTypeParameterConstraints(es2panda_Context context, sequence<checker.Type> typeParameters1, u32 typeParameters1Len, sequence<checker.Type> typeParameters2, u32 typeParameters2Len);

    /* bool IsIdenticalTo(Type const *source, Type const *target) */
    [get] boolean IsIdenticalTo(es2panda_Context context, checker.Type source, checker.Type target);

    /* bool IsIdenticalTo(Type *source, Type *target) */
    boolean IsIdenticalTo1(es2panda_Context context, checker.Type source, checker.Type target);

    /* bool SignatureIsIdenticalTo(Signature *source, Signature *target) */
    boolean SignatureIsIdenticalTo(es2panda_Context context, checker.Signature source, checker.Signature target);

    /* bool IsAssignableTo(Type *source, Type *target) */
    boolean IsAssignableTo(es2panda_Context context, checker.Type source, checker.Type target);

    /* bool IsComparableTo(Type *source, Type *target) */
    boolean IsComparableTo(es2panda_Context context, checker.Type source, checker.Type target);

    /* bool IsCastableTo(Type *const source, Type *const target) */
    boolean IsCastableTo(es2panda_Context context, checker.Type source, checker.Type target);

    /* bool IsSupertypeOf(Type const *super, Type const *sub) */
    [get] boolean IsSupertypeOf(es2panda_Context context, checker.Type super, checker.Type sub);

    /* bool IsLegalBoxedPrimitiveConversion(Type *target, Type *source) */
    boolean IsLegalBoxedPrimitiveConversion(es2panda_Context context, checker.Type target, checker.Type source);

    /* bool IsSupertypeOf(Type *super, Type *sub) */
    boolean IsSupertypeOf1(es2panda_Context context, checker.Type super, checker.Type sub);

    /* bool IsIdenticalTo(IndexInfo *source, IndexInfo *target) */
    boolean IsIdenticalTo2(es2panda_Context context, es2panda_IndexInfo source, es2panda_IndexInfo target);

    /* bool SignatureIsSupertypeOf(Signature *super, Signature *sub) */
    boolean SignatureIsSupertypeOf(es2panda_Context context, checker.Signature super, checker.Signature sub);

    /* bool CheckVarianceRecursively(Type *type, VarianceFlag varianceFlag) */
    boolean CheckVarianceRecursively(es2panda_Context context, checker.Type type, Es2pandaVarianceFlag varianceFlag);

    /* bool IsReadonlyTypeOf(Type *source, Type *target) */
    boolean IsReadonlyTypeOf(es2panda_Context context, checker.Type source, checker.Type target);

    /* VarianceFlag TransferVariant(VarianceFlag variance, VarianceFlag posVariance) */
    Es2pandaVarianceFlag TransferVariant(es2panda_Context context, Es2pandaVarianceFlag variance, Es2pandaVarianceFlag posVariance);

    /* bool Result(bool res) */
    boolean Result(es2panda_Context context, boolean res);

    /* void Result(RelationResult res) */
    void Result1(es2panda_Context context, Es2pandaRelationResult res);

    /* void SetNode(ir::Expression *node) */
    [set] void SetNode(es2panda_Context context, ir.Expression node);

    /* void SetFlags(TypeRelationFlag flags) */
    [set] void SetFlags(es2panda_Context context, Es2pandaTypeRelationFlag flags);

    /* void RemoveFlags(TypeRelationFlag flags) */
    void RemoveFlags(es2panda_Context context, Es2pandaTypeRelationFlag flags);
};

[Entity=Class, c_type=es2panda_Type] interface EnumLiteralType: Type {

    /* EnumLiteralType(util::StringView name, varbinder::Scope *scope, EnumLiteralTypeKind kind) */
    static checker.EnumLiteralType Create(es2panda_Context context, String name, varbinder.Scope scope, Es2pandaEnumLiteralTypeKind kind);

    /* varbinder::Scope *Scope() */
    [get] varbinder.Scope Scope(es2panda_Context context);

    /* const varbinder::Scope *Scope() const */
    [get] varbinder.Scope ScopeConst(es2panda_Context context);

    /* EnumLiteralTypeKind Kind() const */
    [get] Es2pandaEnumLiteralTypeKind KindConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface FloatType: Type {

    /* FloatType() */
    static checker.FloatType Create(es2panda_Context context);

    /* explicit FloatType(UType value) */
    static checker.FloatType Create1(es2panda_Context context, f32 value);

    /* UType GetValue() const */
    [get] f32 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ByteType: Type {

    /* ByteType() */
    static checker.ByteType Create(es2panda_Context context);

    /* explicit ByteType(UType value) */
    static checker.ByteType Create1(es2panda_Context context, i8 value);

    /* UType GetValue() const */
    [get] i8 GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSTypeParameter: Type {

    /* explicit ETSTypeParameter() */
    static checker.ETSTypeParameter Create(es2panda_Context context);

    /* explicit ETSTypeParameter(Type *defaultType, Type *constraintType) */
    static checker.ETSTypeParameter Create1(es2panda_Context context, checker.Type defaultType, checker.Type constraintType);

    /* void SetDeclNode(ir::TSTypeParameter *decl) noexcept */
    [set] void SetDeclNode(es2panda_Context context, ir.TSTypeParameter decl);

    /* [[nodiscard]] ir::TSTypeParameter *GetDeclNode() const noexcept */
    [get] ir.TSTypeParameter GetDeclNodeConst(es2panda_Context context);

    /* [[nodiscard]] ETSTypeParameter *GetOriginal() const */
    checker.ETSTypeParameter GetOriginalConst(es2panda_Context context);

    /* [[nodiscard]] util::StringView const &Name() const noexcept */
    String NameConst(es2panda_Context context);

    /* void SetDefaultType(Type *type) noexcept */
    [set] void SetDefaultType(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] Type *GetDefaultType() const noexcept */
    [get] checker.Type GetDefaultTypeConst(es2panda_Context context);

    /* void SetConstraintType(Type *type) noexcept */
    [set] void SetConstraintType(es2panda_Context context, checker.Type type);

    /* [[nodiscard]] Type *GetConstraintType() const */
    checker.Type GetConstraintTypeConst(es2panda_Context context);

    /* void SetAllowUnsafeVariance(const bool value) */
    [set] void SetAllowUnsafeVariance(es2panda_Context context, boolean value);

    /* [[nodiscard]] bool DoAllowUnsafeVariance() */
    [get] boolean DoAllowUnsafeVariance(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSUnionType: Type {

    /* explicit ETSUnionType(ETSChecker *checker, ArenaVector<Type *> &&constituentTypes, Type *normalizedType = nullptr) */
    static checker.ETSUnionType Create(es2panda_Context context, sequence<checker.Type> constituentTypes, u32 constituentTypesLen, checker.Type normalizedType);

    /* [[nodiscard]] const ArenaVector<Type *> &ConstituentTypes() const noexcept */
    [get] sequence<checker.Type> ConstituentTypesConst(es2panda_Context context);

    /* static void LinearizeAndEraseIdentical(TypeRelation *relation, ArenaVector<Type *> &types,
                                           bool needSubtypeReduction) */
    void LinearizeAndEraseIdentical(es2panda_Context context, checker.TypeRelation relation, sequence<checker.Type> types, u32 typesLen, boolean needSubtypeReduction);

    /* [[nodiscard]] Type *FindUnboxableType() const noexcept */
    checker.Type FindUnboxableTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsOverlapWith(TypeRelation *relation, Type const *type) const noexcept */
    boolean IsOverlapWithConst(es2panda_Context context, checker.TypeRelation relation, checker.Type type);

    /* static void NormalizeTypes(TypeRelation *relation, ArenaVector<Type *> &types) */
    void NormalizeTypes(es2panda_Context context, checker.TypeRelation relation, sequence<checker.Type> types, u32 typesLen);

    /* const util::StringView &GetAssemblerType() const */
    [get] String GetAssemblerTypeConst(es2panda_Context context);

    /* [[nodiscard]] std::pair<checker::Type *, checker::Type *> GetComplimentaryType(ETSChecker *checker,
                                                                                   checker::Type *sourceType) */
    checker.Type GetComplimentaryType(es2panda_Context context, checker.Type sourceType, sequence<checker.Type> returnTypeSecond);

    /* [[nodiscard]] Type *NormalizedType() const */
    [get] checker.Type NormalizedTypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsNormalizedUnion() const */
    [get] boolean IsNormalizedUnionConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface EnumType: Type {

    /* EnumType(varbinder::Variable *enumLiteralVar, varbinder::EnumVariable *enumVar) */
    static checker.EnumType Create(es2panda_Context context, varbinder.Variable enumLiteralVar, varbinder.EnumVariable enumVar);

    /* const varbinder::Variable *EnumLiteralVar() const */
    [get] varbinder.Variable EnumLiteralVarConst(es2panda_Context context);

    /* const varbinder::EnumVariable *EnumVar() const */
    [get] varbinder.EnumVariable EnumVarConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface WildcardType: Type {

    /* WildcardType() */
    static checker.WildcardType Create(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSBooleanType: Type {

    /* ETSBooleanType() */
    static checker.ETSBooleanType Create(es2panda_Context context);

    /* explicit ETSBooleanType(UType value) */
    static checker.ETSBooleanType Create1(es2panda_Context context, boolean value);

    /* UType GetValue() const */
    [get] boolean GetValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface BooleanLiteralType: Type {

    /* explicit BooleanLiteralType(bool value) */
    static checker.BooleanLiteralType Create(es2panda_Context context, boolean value);

    /* bool Value() const */
    [get] boolean ValueConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ETSObjectType: Type {

    /* explicit ETSObjectType(ArenaAllocator *allocator, util::StringView name, util::StringView internalName,
                           ir::AstNode *declNode, ETSObjectFlags flags) */
    static checker.ETSObjectType Create(es2panda_Context context, String name, String internalName, ir.AstNode declNode, Es2pandaETSObjectFlags flags);

    /* void AddConstructSignature(Signature *signature) */
    [set] void AddConstructSignature(es2panda_Context context, checker.Signature signature);

    /* void AddConstructSignature(const ArenaVector<Signature *> &signatures) const */
    [set] void AddConstructSignatureConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen);

    /* void AddInterface(ETSObjectType *interfaceType) */
    [set] void AddInterface(es2panda_Context context, checker.ETSObjectType interfaceType);

    /* void SetSuperType(ETSObjectType *super) */
    [set] void SetSuperType(es2panda_Context context, checker.ETSObjectType super);

    /* void SetTypeArguments(ArenaVector<Type *> &&typeArgs) */
    [set] void SetTypeArguments(es2panda_Context context, sequence<checker.Type> typeArgs, u32 typeArgsLen);

    /* void SetEnclosingType(ETSObjectType *enclosingType) */
    [set] void SetEnclosingType(es2panda_Context context, checker.ETSObjectType enclosingType);

    /* void SetRelation(TypeRelation *relation) */
    [set] void SetRelation(es2panda_Context context, checker.TypeRelation relation);

    /* TypeRelation *GetRelation() const */
    [get] checker.TypeRelation GetRelationConst(es2panda_Context context);

    /* const ArenaVector<Type *> &TypeArguments() const */
    [get] sequence<checker.Type> TypeArgumentsConst(es2panda_Context context);

    /* const ArenaVector<Signature *> &ConstructSignatures() const */
    sequence<checker.Signature> ConstructSignaturesConst(es2panda_Context context);

    /* ArenaVector<Signature *> &ConstructSignatures() */
    sequence<checker.Signature> ConstructSignatures(es2panda_Context context);

    /* const ArenaVector<ETSObjectType *> &Interfaces() const */
    sequence<checker.ETSObjectType> InterfacesConst(es2panda_Context context);

    /* const ArenaVector<ETSObjectType *> &Interfaces() */
    sequence<checker.ETSObjectType> Interfaces(es2panda_Context context);

    /* ir::AstNode *GetDeclNode() const */
    [get] ir.AstNode GetDeclNodeConst(es2panda_Context context);

    /* const ETSObjectType *SuperType() const */
    [get] checker.ETSObjectType SuperTypeConst(es2panda_Context context);

    /* ETSObjectType *SuperType() */
    [get] checker.ETSObjectType SuperType(es2panda_Context context);

    /* const ETSObjectType *EnclosingType() const */
    [get] checker.ETSObjectType EnclosingTypeConst(es2panda_Context context);

    /* ETSObjectType *EnclosingType() */
    [get] checker.ETSObjectType EnclosingType(es2panda_Context context);

    /* ETSObjectType *OutermostClass() */
    checker.ETSObjectType OutermostClass(es2panda_Context context);

    /* void SetBaseType(ETSObjectType *baseType) */
    [set] void SetBaseType(es2panda_Context context, checker.ETSObjectType baseType);

    /* ETSObjectType *GetBaseType() noexcept */
    [get] checker.ETSObjectType GetBaseType(es2panda_Context context);

    /* const ETSObjectType *GetBaseType() const noexcept */
    [get] checker.ETSObjectType GetBaseTypeConst(es2panda_Context context);

    /* const ArenaSet<ETSObjectType *> &TransitiveSupertypes() const noexcept */
    [get] sequence<checker.ETSObjectType> TransitiveSupertypesConst(es2panda_Context context);

    /* ETSObjectType const *GetConstOriginalBaseType() const noexcept */
    checker.ETSObjectType GetConstOriginalBaseTypeConst(es2panda_Context context);

    /* ETSObjectType *GetOriginalBaseType() const noexcept */
    [get] checker.ETSObjectType GetOriginalBaseTypeConst(es2panda_Context context);

    /* bool IsGlobalETSObjectType() const noexcept */
    [get] boolean IsGlobalETSObjectTypeConst(es2panda_Context context);

    /* bool IsPropertyInherited(const varbinder::Variable *var) */
    boolean IsPropertyInherited(es2panda_Context context, varbinder.Variable var);

    /* bool IsPropertyOfAscendant(const varbinder::Variable *var) const */
    boolean IsPropertyOfAscendantConst(es2panda_Context context, varbinder.Variable var);

    /* bool IsSignatureInherited(Signature *signature) */
    boolean IsSignatureInherited(es2panda_Context context, checker.Signature signature);

    /* bool IsDescendantOf(const ETSObjectType *ascendant) const */
    boolean IsDescendantOfConst(es2panda_Context context, checker.ETSObjectType ascendant);

    /* util::StringView Name() const */
    [get] String NameConst(es2panda_Context context);

    /* util::StringView AssemblerName() const */
    String AssemblerNameConst(es2panda_Context context);

    /* ETSObjectFlags ObjectFlags() const */
    [get] Es2pandaETSObjectFlags ObjectFlagsConst(es2panda_Context context);

    /* void AddObjectFlag(ETSObjectFlags flag) */
    [set] void AddObjectFlag(es2panda_Context context, Es2pandaETSObjectFlags flag);

    /* void RemoveObjectFlag(ETSObjectFlags flag) */
    void RemoveObjectFlag(es2panda_Context context, Es2pandaETSObjectFlags flag);

    /* bool HasObjectFlag(ETSObjectFlags flag) const */
    [get] boolean HasObjectFlagConst(es2panda_Context context, Es2pandaETSObjectFlags flag);

    /* bool IsInterface() const */
    [get] boolean IsInterfaceConst(es2panda_Context context);

    /* bool IsGradual() const */
    [get] boolean IsGradualConst(es2panda_Context context);

    /* bool IsETSStringLiteralType() const */
    [get] boolean IsETSStringLiteralTypeConst(es2panda_Context context);

    /* ETSFunctionType *GetFunctionalInterfaceInvokeType() const */
    checker.ETSFunctionType GetFunctionalInterfaceInvokeTypeConst(es2panda_Context context);

    /* ETSObjectFlags BuiltInKind() const */
    [get] Es2pandaETSObjectFlags BuiltInKindConst(es2panda_Context context);

    /* ETSObjectFlags UnboxableKind() const */
    [get] Es2pandaETSObjectFlags UnboxableKindConst(es2panda_Context context);

    /* ETSObjectType *GetTypeInstantiation(ETSChecker *checker, std::string const &hash) */
    checker.ETSObjectType GetTypeInstantiation(es2panda_Context context, String hash);

    /* varbinder::Scope *GetTypeArgumentScope() const */
    varbinder.Scope GetTypeArgumentScopeConst(es2panda_Context context);

    /* void InsertTypeInstantiation(ETSChecker *checker, std::string &hash, ETSObjectType *value) */
    void InsertTypeInstantiation(es2panda_Context context, String hash, checker.ETSObjectType value);

    /* [[nodiscard]] bool IsGeneric() const noexcept */
    [get] boolean IsGenericConst(es2panda_Context context);

    /* [[nodiscard]] bool IsPartial() const noexcept */
    [get] boolean IsPartialConst(es2panda_Context context);

    /* std::vector<const varbinder::LocalVariable *> ForeignProperties() const */
    sequence<varbinder.LocalVariable> ForeignPropertiesConst(es2panda_Context context);

    /* varbinder::LocalVariable *GetProperty(util::StringView name, PropertySearchFlags flags) const */
    varbinder.LocalVariable GetPropertyConst(es2panda_Context context, String name, Es2pandaPropertySearchFlags flags);

    /* std::vector<varbinder::LocalVariable *> GetAllProperties() const */
    sequence<varbinder.LocalVariable> GetAllPropertiesConst(es2panda_Context context);

    /* void ForEachAllOwnProperties(const PropertyTraverser &cb) const */
    void ForEachAllOwnPropertiesConst(es2panda_Context context, PropertyTraverser cb);

    /* void ForEachAllNonOwnProperties(const PropertyTraverser &cb) const */
    void ForEachAllNonOwnPropertiesConst(es2panda_Context context, PropertyTraverser cb);

    /* varbinder::LocalVariable *CopyProperty(varbinder::LocalVariable *prop, ArenaAllocator *allocator,
                                           TypeRelation *relation, GlobalTypesHolder *globalTypes) */
    varbinder.LocalVariable CopyProperty(es2panda_Context context, varbinder.LocalVariable prop, checker.TypeRelation relation, checker.GlobalTypesHolder globalTypes);

    /* std::vector<varbinder::LocalVariable *> Methods() const */
    sequence<varbinder.LocalVariable> MethodsConst(es2panda_Context context);

    /* std::vector<varbinder::LocalVariable *> Fields() const */
    sequence<varbinder.LocalVariable> FieldsConst(es2panda_Context context);

    /* std::vector<varbinder::LocalVariable *> Overloads() const */
    sequence<varbinder.LocalVariable> OverloadsConst(es2panda_Context context);

    /* varbinder::LocalVariable *CreateSyntheticVarFromEverySignature(const util::StringView &name,
                                                                   PropertySearchFlags flags) const */
    varbinder.LocalVariable CreateSyntheticVarFromEverySignatureConst(es2panda_Context context, String name, Es2pandaPropertySearchFlags flags);

    /* varbinder::LocalVariable *CollectSignaturesForSyntheticType(std::vector<Signature *> &signatures,
                                                                const util::StringView &name,
                                                                PropertySearchFlags flags) const */
    varbinder.LocalVariable CollectSignaturesForSyntheticTypeConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen, String name, Es2pandaPropertySearchFlags flags);

    /* void AddSignatureFromFunction(std::vector<Signature *> &signatures, PropertySearchFlags flags, ETSChecker *checker,
                                  varbinder::LocalVariable *found) const */
    [set] void AddSignatureFromFunctionConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen, Es2pandaPropertySearchFlags flags, varbinder.LocalVariable found);

    /* void AddSignatureFromOverload(std::vector<Signature *> &signatures, PropertySearchFlags flags,
                                  varbinder::LocalVariable *found) const */
    [set] void AddSignatureFromOverloadConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen, Es2pandaPropertySearchFlags flags, varbinder.LocalVariable found);

    /* void AddSignatureFromConstructor(std::vector<Signature *> &signatures, varbinder::LocalVariable *found) const */
    [set] void AddSignatureFromConstructorConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen, varbinder.LocalVariable found);

    /* bool ReplaceArgumentInSignature(std::vector<Signature *> &signatures, Signature *sigToInsert,
                                    TypeRelation *relation) const */
    boolean ReplaceArgumentInSignatureConst(es2panda_Context context, sequence<checker.Signature> signatures, u32 signaturesLen, checker.Signature sigToInsert, checker.TypeRelation relation);

    /* bool CheckIdenticalFlags(ETSObjectType *other) const */
    boolean CheckIdenticalFlagsConst(es2panda_Context context, checker.ETSObjectType other);

    /* void IterateProperties(const PropertyTraverser &cb) const */
    void IteratePropertiesConst(es2panda_Context context, PropertyTraverser cb);

    /* bool IsBoxedPrimitive() const */
    boolean IsBoxedPrimitiveConst(es2panda_Context context);

    /* void UpdateTypeProperties(PropertyProcesser const &func) */
    [set] void UpdateTypeProperties(es2panda_Context context, PropertyProcessor func);

    /* ETSObjectType *SubstituteArguments(TypeRelation *relation, ArenaVector<Type *> const &arguments) */
    checker.ETSObjectType SubstituteArguments(es2panda_Context context, checker.TypeRelation relation, sequence<checker.Type> arguments, u32 argumentsLen);

    /* bool CastNumericObject(TypeRelation *relation, Type *target) */
    boolean CastNumericObject(es2panda_Context context, checker.TypeRelation relation, checker.Type target);

    /* ETSObjectType *ProcessInterfaceBaseType(std::unordered_set<Type *> *extendsSet) */
    checker.ETSObjectType ProcessInterfaceBaseType(es2panda_Context context, sequence<checker.Type> extendsSet, u32 extendsSetLen);

    /* static std::string NameToDescriptor(util::StringView name) */
    String NameToDescriptor(es2panda_Context context, String name);

    /* void AddReExports(ETSObjectType *reExport) */
    [set] void AddReExports(es2panda_Context context, checker.ETSObjectType reExport);

    /* void AddReExportAlias(util::StringView const &value, util::StringView const &key) */
    [set] void AddReExportAlias(es2panda_Context context, String value, String key);

    /* util::StringView GetReExportAliasValue(util::StringView const &key) const */
    String GetReExportAliasValueConst(es2panda_Context context, String key);

    /* bool IsReExportHaveAliasValue(util::StringView const &key) const */
    boolean IsReExportHaveAliasValueConst(es2panda_Context context, String key);

    /* const ArenaVector<ETSObjectType *> &ReExports() const */
    sequence<checker.ETSObjectType> ReExportsConst(es2panda_Context context);

    /* bool IsSameBasedGeneric(TypeRelation *relation, Type const *other) const */
    boolean IsSameBasedGenericConst(es2panda_Context context, checker.TypeRelation relation, checker.Type other);

    /* [[nodiscard]] static std::uint32_t GetPrecedence(checker::ETSChecker *checker, ETSObjectType const *type) noexcept */
    u32 GetPrecedence(es2panda_Context context, checker.ETSObjectType type);

    /* bool IsPropertiesInstantiated() const */
    [get] boolean IsPropertiesInstantiatedConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ArrayType: Type {

    /* explicit ArrayType(Type *elementType) */
    static checker.ArrayType Create(es2panda_Context context, checker.Type elementType);

    /* Type *ElementType() */
    [get] checker.Type ElementType(es2panda_Context context);

    /* const Type *ElementType() const */
    [get] checker.Type ElementTypeConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Type] interface ShortType: Type {

    /* ShortType() */
    static checker.ShortType Create(es2panda_Context context);

    /* explicit ShortType(UType value) */
    static checker.ShortType Create1(es2panda_Context context, i16 value);

    /* UType GetValue() const */
    [get] i16 GetValueConst(es2panda_Context context);
};

[Entity=Class] interface Checker {
};

[Entity=Class] interface ETSChecker: Checker {
};

[Entity=Class, c_type=es2panda_CheckerContext] interface CheckerContext {

    /* explicit CheckerContext(Checker *checker, CheckerStatus newStatus) */
    static checker.CheckerContext Create(es2panda_Context context, Es2pandaCheckerStatus newStatus);

    /* explicit CheckerContext(Checker *checker, CheckerStatus newStatus, const ETSObjectType *containingClass) */
    static checker.CheckerContext Create1(es2panda_Context context, Es2pandaCheckerStatus newStatus, checker.ETSObjectType containingClass);

    /* explicit CheckerContext(Checker *checker, CheckerStatus newStatus, const ETSObjectType *containingClass,
                            Signature *containingSignature) */
    static checker.CheckerContext Create2(es2panda_Context context, Es2pandaCheckerStatus newStatus, checker.ETSObjectType containingClass, checker.Signature containingSignature);

    /* [[nodiscard]] const CapturedVarsMap &CapturedVars() const noexcept */
    [get] sequence<varbinder.Variable> CapturedVarsConst(es2panda_Context context, sequence<sequence<es2panda_SourcePosition>> arenaMapValueArray);

    /* [[nodiscard]] CapturedVarsMap &CapturedVars() noexcept */
    [get] sequence<varbinder.Variable> CapturedVars(es2panda_Context context, sequence<sequence<es2panda_SourcePosition>> arenaMapValueArray);

    /* [[nodiscard]] const CheckerStatus &Status() const noexcept */
    [get] Es2pandaCheckerStatus StatusConst(es2panda_Context context);

    /* [[nodiscard]] ETSObjectType *ContainingClass() const noexcept */
    [get] checker.ETSObjectType ContainingClassConst(es2panda_Context context);

    /* [[nodiscard]] Signature *ContainingSignature() const noexcept */
    [get] checker.Signature ContainingSignatureConst(es2panda_Context context);

    /* [[nodiscard]] CheckerStatus &Status() noexcept */
    [get] Es2pandaCheckerStatus Status(es2panda_Context context);

    /* [[nodiscard]] varbinder::Variable *ContainingOverloadDeclaration() noexcept */
    [get] varbinder.Variable ContainingOverloadDeclaration(es2panda_Context context);

    /* void SetContainingSignature(Signature *containingSignature) noexcept */
    [set] void SetContainingSignature(es2panda_Context context, checker.Signature containingSignature);

    /* void SetContainingClass(ETSObjectType *containingClass) noexcept */
    [set] void SetContainingClass(es2panda_Context context, checker.ETSObjectType containingClass);

    /* void SetContainingOverloadDeclaration(varbinder::Variable *containingOverloadDeclaration) noexcept */
    [set] void SetContainingOverloadDeclaration(es2panda_Context context, varbinder.Variable containingOverloadDeclaration);

    /* void AddCapturedVar(varbinder::Variable *var, const lexer::SourcePosition &pos) */
    [set] void AddCapturedVar(es2panda_Context context, varbinder.Variable var, es2panda_SourcePosition pos);

    /* [[nodiscard]] ir::ArrowFunctionExpression *ContainingLambda() const noexcept */
    [get] ir.ArrowFunctionExpression ContainingLambdaConst(es2panda_Context context);

    /* void SetContainingLambda(ir::ArrowFunctionExpression *containingLambda) noexcept */
    [set] void SetContainingLambda(es2panda_Context context, ir.ArrowFunctionExpression containingLambda);

    /* void ClearSmartCasts() noexcept */
    void ClearSmartCasts(es2panda_Context context);

    /* void RemoveSmartCast(varbinder::Variable const *const variable) noexcept */
    void RemoveSmartCast(es2panda_Context context, varbinder.Variable variable);

    /* void SetSmartCast(varbinder::Variable const *const variable, checker::Type *const smartType) noexcept */
    [set] void SetSmartCast(es2panda_Context context, varbinder.Variable variable, checker.Type smartType);

    /* [[nodiscard]] checker::Type *GetSmartCast(varbinder::Variable const *const variable) const noexcept */
    checker.Type GetSmartCastConst(es2panda_Context context, varbinder.Variable variable);

    /* [[nodiscard]] bool IsInTestExpression() const noexcept */
    [get] boolean IsInTestExpressionConst(es2panda_Context context);

    /* [[nodiscard]] bool IsInLoop() const noexcept */
    [get] boolean IsInLoopConst(es2panda_Context context);

    /* void EnterPath() noexcept */
    void EnterPath(es2panda_Context context);

    /* [[nodiscard]] bool ExitPath() noexcept */
    boolean ExitPath(es2panda_Context context);

    /* checker::Type *GetIntersectionOfTypes(checker::Type *type1, checker::Type *type2) const noexcept */
    checker.Type GetIntersectionOfTypesConst(es2panda_Context context, checker.Type type1, checker.Type type2);

    /* checker::Type *GetUnionOfTypes(checker::Type *type1, checker::Type *type2) const noexcept */
    checker.Type GetUnionOfTypesConst(es2panda_Context context, checker.Type type1, checker.Type type2);

    /* void CheckTestSmartCastCondition(lexer::TokenType operatorType) */
    void CheckTestSmartCastCondition(es2panda_Context context, Es2pandaTokenType operatorType);

    /* void CheckIdentifierSmartCastCondition(ir::Identifier const *identifier) noexcept */
    void CheckIdentifierSmartCastCondition(es2panda_Context context, ir.Identifier identifier);

    /* void CheckUnarySmartCastCondition(ir::UnaryExpression const *unaryExpression) noexcept */
    void CheckUnarySmartCastCondition(es2panda_Context context, ir.UnaryExpression unaryExpression);

    /* void CheckBinarySmartCastCondition(ir::BinaryExpression *binaryExpression) noexcept */
    void CheckBinarySmartCastCondition(es2panda_Context context, ir.BinaryExpression binaryExpression);

    /* void OnBreakStatement(ir::BreakStatement const *breakStatement) */
    void OnBreakStatement(es2panda_Context context, ir.BreakStatement breakStatement);

    /* void CombineBreakSmartCasts(ir::Statement const *targetStatement) */
    void CombineBreakSmartCasts(es2panda_Context context, ir.Statement targetStatement);
};

[Entity=Class, c_type=es2panda_ResolveResult] interface ResolveResult {

    /* explicit ResolveResult(varbinder::Variable *v, ResolvedKind kind) */
    static checker.ResolveResult Create(es2panda_Context context, varbinder.Variable v, Es2pandaResolvedKind kind);

    /* varbinder::Variable *Variable() */
    [get] varbinder.Variable Variable(es2panda_Context context);

    /* ResolvedKind Kind() */
    [get] Es2pandaResolvedKind Kind(es2panda_Context context);
};

};  // namespace checker

namespace varbinder {

[Entity=Class, c_type=es2panda_Variable] interface Variable {

    /* [[nodiscard]] const Decl *Declaration() const noexcept */
    [get] varbinder.Decl DeclarationConst(es2panda_Context context);

    /* [[nodiscard]] Decl *Declaration() noexcept */
    [get] varbinder.Decl Declaration(es2panda_Context context);

    /* [[nodiscard]] VariableFlags Flags() const noexcept */
    [get] Es2pandaVariableFlags FlagsConst(es2panda_Context context);

    /* [[nodiscard]] checker::Type *TsType() const */
    [get] checker.Type TsTypeConst(es2panda_Context context);

    /* [[nodiscard]] Scope *GetScope() const noexcept */
    [get] varbinder.Scope GetScopeConst(es2panda_Context context);

    /* checker::Type *SetTsType(checker::Type *tsType) noexcept */
    [get] checker.Type SetTsType(es2panda_Context context, checker.Type tsType);

    /* void SetScope(varbinder::Scope *scope) noexcept */
    [set] void SetScope(es2panda_Context context, varbinder.Scope scope);

    /* void AddFlag(VariableFlags flag) noexcept */
    [set] void AddFlag(es2panda_Context context, Es2pandaVariableFlags flag);

    /* [[nodiscard]] bool HasFlag(VariableFlags flag) const noexcept */
    [get] boolean HasFlagConst(es2panda_Context context, Es2pandaVariableFlags flag);

    /* void RemoveFlag(VariableFlags flag) noexcept */
    void RemoveFlag(es2panda_Context context, Es2pandaVariableFlags flag);

    /* void Reset(Decl *decl, VariableFlags flags) noexcept */
    void Reset(es2panda_Context context, varbinder.Decl decl, Es2pandaVariableFlags flags);

    /* [[nodiscard]] bool LexicalBound() const noexcept */
    [get] boolean LexicalBoundConst(es2panda_Context context);

    /* [[nodiscard]] const util::StringView &Name() const */
    String NameConst(es2panda_Context context);

    /* virtual void SetLexical(Scope *scope) = 0 */
    [set] void SetLexical(es2panda_Context context, varbinder.Scope scope);
};

[Entity=Class, c_type=es2panda_Variable] interface LocalVariable: Variable {

    /* explicit LocalVariable(Decl *decl, VariableFlags flags) */
    static varbinder.LocalVariable Create(es2panda_Context context, varbinder.Decl decl, Es2pandaVariableFlags flags);

    /* explicit LocalVariable(const VariableFlags flags) */
    static varbinder.LocalVariable Create1(es2panda_Context context, Es2pandaVariableFlags flags);

    /* void BindVReg(compiler::VReg vreg) */
    void BindVReg(es2panda_Context context, es2panda_VReg vreg);

    /* void BindLexEnvSlot(uint32_t slot) */
    void BindLexEnvSlot(es2panda_Context context, u32 slot);

    /* compiler::VReg Vreg() const */
    [get] es2panda_VReg VregConst(es2panda_Context context);

    /* compiler::VReg &Vreg() */
    [get] es2panda_VReg Vreg(es2panda_Context context);

    /* uint32_t LexIdx() const */
    u32 LexIdxConst(es2panda_Context context);

    /* LocalVariable *Copy(ArenaAllocator *allocator, Decl *decl) const */
    varbinder.LocalVariable CopyConst(es2panda_Context context, varbinder.Decl decl);
};

[Entity=Class, c_type=es2panda_Variable] interface GlobalVariable: Variable {

    /* explicit GlobalVariable(Decl *decl, VariableFlags flags) */
    static varbinder.GlobalVariable Create(es2panda_Context context, varbinder.Decl decl, Es2pandaVariableFlags flags);
};

[Entity=Class, c_type=es2panda_Variable] interface ModuleVariable: Variable {

    /* explicit ModuleVariable(Decl *decl, VariableFlags flags) */
    static varbinder.ModuleVariable Create(es2panda_Context context, varbinder.Decl decl, Es2pandaVariableFlags flags);

    /* compiler::VReg &ModuleReg() */
    [get] es2panda_VReg ModuleReg(es2panda_Context context);

    /* compiler::VReg ModuleReg() const */
    [get] es2panda_VReg ModuleRegConst(es2panda_Context context);

    /* const util::StringView &ExoticName() const */
    [get] String ExoticNameConst(es2panda_Context context);

    /* util::StringView &ExoticName() */
    [get] String ExoticName(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Variable] interface EnumVariable: Variable {

    /* explicit EnumVariable(Decl *decl, bool backReference = false) */
    static varbinder.EnumVariable Create(es2panda_Context context, varbinder.Decl decl, boolean backReference);

    /* void SetValue(EnumMemberResult value) */
    [set] void SetValue(es2panda_Context context, es2panda_variantDoubleCharArrayBool value);

    /* const EnumMemberResult &Value() const */
    [get] es2panda_variantDoubleCharArrayBool ValueConst(es2panda_Context context);

    /* bool BackReference() const */
    [get] boolean BackReferenceConst(es2panda_Context context);

    /* void SetBackReference() */
    [set] void SetBackReference(es2panda_Context context);

    /* void ResetDecl(Decl *decl) */
    void ResetDecl(es2panda_Context context, varbinder.Decl decl);
};

[Entity=Class, c_type=es2panda_Scope] interface Scope {

    /* virtual ScopeType Type() const = 0 */
    Es2pandaScopeType TypeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsVariableScope() const noexcept */
    [get] boolean IsVariableScopeConst(es2panda_Context context);

    /* [[nodiscard]] bool IsFunctionVariableScope() const noexcept */
    [get] boolean IsFunctionVariableScopeConst(es2panda_Context context);

    /* [[nodiscard]] FunctionScope *AsFunctionVariableScope() */
    varbinder.FunctionScope AsFunctionVariableScope(es2panda_Context context);

    /* [[nodiscard]] const FunctionScope *AsFunctionVariableScope() const */
    varbinder.FunctionScope AsFunctionVariableScopeConst(es2panda_Context context);

    /* [[nodiscard]] VariableScope *AsVariableScope() */
    varbinder.VariableScope AsVariableScope(es2panda_Context context);

    /* [[nodiscard]] const VariableScope *AsVariableScope() const */
    varbinder.VariableScope AsVariableScopeConst(es2panda_Context context);

    /* [[nodiscard]] VariableScope *EnclosingVariableScope() noexcept */
    varbinder.VariableScope EnclosingVariableScope(es2panda_Context context);

    /* [[nodiscard]] const VariableScope *EnclosingVariableScope() const noexcept */
    varbinder.VariableScope EnclosingVariableScopeConst(es2panda_Context context);

    /* void AddFlag(ScopeFlags flag) noexcept */
    [set] void AddFlag(es2panda_Context context, Es2pandaScopeFlags flag);

    /* void ClearFlag(ScopeFlags flag) noexcept */
    void ClearFlag(es2panda_Context context, Es2pandaScopeFlags flag);

    /* [[nodiscard]] bool HasFlag(ScopeFlags flag) const noexcept */
    [get] boolean HasFlagConst(es2panda_Context context, Es2pandaScopeFlags flag);

    /* [[nodiscard]] ArenaVector<Decl *> &Decls() noexcept */
    [get] sequence<varbinder.Decl> Decls(es2panda_Context context);

    /* [[nodiscard]] const ArenaVector<Decl *> &Decls() const noexcept */
    [get] sequence<varbinder.Decl> DeclsConst(es2panda_Context context);

    /* void SetParent(Scope *parent) noexcept */
    void SetParent(es2panda_Context context, varbinder.Scope parent);

    /* [[nodiscard]] Scope *Parent() noexcept */
    [get] varbinder.Scope Parent(es2panda_Context context);

    /* [[nodiscard]] const Scope *Parent() const noexcept */
    [get] varbinder.Scope ParentConst(es2panda_Context context);

    /* [[nodiscard]] ir::AstNode *Node() noexcept */
    [get] ir.AstNode Node(es2panda_Context context);

    /* [[nodiscard]] const ir::AstNode *Node() const noexcept */
    [get] ir.AstNode NodeConst(es2panda_Context context);

    /* void BindNode(ir::AstNode *node) noexcept */
    void BindNode(es2panda_Context context, ir.AstNode node);

    /* Variable *AddDecl(ArenaAllocator *allocator, Decl *decl, ScriptExtension extension) */
    [set] varbinder.Variable AddDecl(es2panda_Context context, varbinder.Decl decl);

    /* Variable *AddTsDecl(ArenaAllocator *allocator, Decl *decl, ScriptExtension extension) */
    [set] varbinder.Variable AddTsDecl(es2panda_Context context, varbinder.Decl decl);

    /* virtual void MergeBindings(VariableMap const &bindings) */
    void MergeBindings(es2panda_Context context, sequence<String> bindingsKeyArray, sequence<varbinder.Variable> bindingsValueArray, u32 bindingsLen);

    /* virtual VariableMap::size_type EraseBinding(const util::StringView &name) */
    u32 EraseBinding(es2panda_Context context, String name);

    /* virtual bool CorrectForeignBinding(const util::StringView &name, Variable *builtinVar, Variable *redefinedVar) */
    boolean CorrectForeignBinding(es2panda_Context context, String name, varbinder.Variable builtinVar, varbinder.Variable redefinedVar);

    /* [[nodiscard]] const VariableMap &Bindings() const noexcept */
    [get] sequence<String> BindingsConst(es2panda_Context context, sequence<sequence<varbinder.Variable>> arenaMapValueArray);

    /* virtual Variable *AddBinding(ArenaAllocator *allocator, Variable *currentVariable, Decl *newDecl,
                                 [[maybe_unused]] ScriptExtension extension) = 0 */
    [set] varbinder.Variable AddBinding(es2panda_Context context, varbinder.Variable currentVariable, varbinder.Decl newDecl);

    /* virtual Variable *FindLocal(const util::StringView &name, ResolveBindingOptions options) const */
    varbinder.Variable FindLocalConst(es2panda_Context context, String name, Es2pandaResolveBindingOptions options);

    /* [[nodiscard]] bool IsSuperscopeOf(const varbinder::Scope *subscope) const noexcept */
    boolean IsSuperscopeOfConst(es2panda_Context context, varbinder.Scope subscope);

    /* ConstScopeFindResult Find(const util::StringView &name,
                              ResolveBindingOptions options = ResolveBindingOptions::BINDINGS) const */
    es2panda_ScopeFindResult FindConst(es2panda_Context context, String name, Es2pandaResolveBindingOptions options);

    /* ScopeFindResult Find(const util::StringView &name, ResolveBindingOptions options = ResolveBindingOptions::BINDINGS) */
    es2panda_ScopeFindResult Find(es2panda_Context context, String name, Es2pandaResolveBindingOptions options);

    /* ConstScopeFindResult FindInGlobal(const util::StringView &name,
                                      ResolveBindingOptions options = ResolveBindingOptions::BINDINGS) const */
    es2panda_ScopeFindResult FindInGlobalConst(es2panda_Context context, String name, Es2pandaResolveBindingOptions options);

    /* ConstScopeFindResult FindInFunctionScope(const util::StringView &name,
                                             ResolveBindingOptions options = ResolveBindingOptions::BINDINGS) const */
    es2panda_ScopeFindResult FindInFunctionScopeConst(es2panda_Context context, String name, Es2pandaResolveBindingOptions options);

    /* [[nodiscard]] Decl *FindDecl(const util::StringView &name) const noexcept */
    varbinder.Decl FindDeclConst(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Scope] interface VariableScope: Scope {

    /* uint32_t NextSlot() */
    [get] u32 NextSlot(es2panda_Context context);

    /* uint32_t LexicalSlots() const */
    [get] u32 LexicalSlotsConst(es2panda_Context context);

    /* bool NeedLexEnv() const */
    [get] boolean NeedLexEnvConst(es2panda_Context context);

    /* uint32_t EvalBindings() const */
    [get] u32 EvalBindingsConst(es2panda_Context context);

    /* void CheckDirectEval(public_lib::Context *context) */
    void CheckDirectEval(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Scope] interface ParamScope: Scope {

    /* ArenaVector<LocalVariable *> &Params() */
    [get] sequence<varbinder.LocalVariable> Params(es2panda_Context context);

    /* const ArenaVector<LocalVariable *> &Params() const */
    [get] sequence<varbinder.LocalVariable> ParamsConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Scope] interface FunctionParamScope: ParamScope {

    /* explicit FunctionParamScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.FunctionParamScope Create(es2panda_Context context, varbinder.Scope parent);

    /* FunctionScope *GetFunctionScope() const */
    [get] varbinder.FunctionScope GetFunctionScopeConst(es2panda_Context context);

    /* void BindFunctionScope(FunctionScope *funcScope) */
    void BindFunctionScope(es2panda_Context context, varbinder.FunctionScope funcScope);

    /* [[nodiscard]] LocalVariable *NameVar() const noexcept */
    [get] varbinder.LocalVariable NameVarConst(es2panda_Context context);

    /* void BindName(ArenaAllocator *allocator, util::StringView name) */
    void BindName(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Scope] interface LocalScope: Scope {

    /* explicit LocalScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.LocalScope Create(es2panda_Context context, varbinder.Scope parent);

    /* explicit LocalScope(ArenaAllocator *allocator, Scope *parent, ScopeFlags flags) */
    static varbinder.LocalScope Create1(es2panda_Context context, varbinder.Scope parent, Es2pandaScopeFlags flags);
};

[Entity=Class, c_type=es2panda_Scope] interface FunctionScope {

    /* explicit FunctionScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.FunctionScope Create(es2panda_Context context, varbinder.Scope parent);

    /* void BindName(util::StringView name) */
    void BindName(es2panda_Context context, String name);

    /* void BindInternalName(util::StringView internalName) */
    void BindInternalName(es2panda_Context context, String internalName);

    /* const util::StringView &Name() const */
    [get] String NameConst(es2panda_Context context);

    /* const util::StringView &InternalName() const */
    [get] String InternalNameConst(es2panda_Context context);

    /* Variable *InsertBindingIfAbsentInScope(ArenaAllocator *allocator, Variable *currentVariable, Decl *newDecl,
                                           VariableFlags flag) */
    varbinder.Variable InsertBindingIfAbsentInScope(es2panda_Context context, varbinder.Variable currentVariable, varbinder.Decl newDecl, Es2pandaVariableFlags flag);
};

[Entity=Class, c_type=es2panda_Scope] interface ClassScope: LocalScope {

    /* explicit ClassScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.ClassScope Create(es2panda_Context context, varbinder.Scope parent);

    /* LocalScope *TypeAliasScope() */
    [get] varbinder.LocalScope TypeAliasScope(es2panda_Context context);

    /* const LocalScope *TypeAliasScope() const */
    [get] varbinder.LocalScope TypeAliasScopeConst(es2panda_Context context);

    /* LocalScope *StaticDeclScope() */
    [get] varbinder.LocalScope StaticDeclScope(es2panda_Context context);

    /* const LocalScope *StaticDeclScope() const */
    [get] varbinder.LocalScope StaticDeclScopeConst(es2panda_Context context);

    /* LocalScope *StaticFieldScope() */
    [get] varbinder.LocalScope StaticFieldScope(es2panda_Context context);

    /* const LocalScope *StaticFieldScope() const */
    [get] varbinder.LocalScope StaticFieldScopeConst(es2panda_Context context);

    /* LocalScope *StaticMethodScope() */
    [get] varbinder.LocalScope StaticMethodScope(es2panda_Context context);

    /* const LocalScope *StaticMethodScope() const */
    [get] varbinder.LocalScope StaticMethodScopeConst(es2panda_Context context);

    /* LocalScope *InstanceFieldScope() */
    [get] varbinder.LocalScope InstanceFieldScope(es2panda_Context context);

    /* const LocalScope *InstanceFieldScope() const */
    [get] varbinder.LocalScope InstanceFieldScopeConst(es2panda_Context context);

    /* LocalScope *InstanceMethodScope() */
    [get] varbinder.LocalScope InstanceMethodScope(es2panda_Context context);

    /* const LocalScope *InstanceMethodScope() const */
    [get] varbinder.LocalScope InstanceMethodScopeConst(es2panda_Context context);

    /* LocalScope *InstanceDeclScope() */
    [get] varbinder.LocalScope InstanceDeclScope(es2panda_Context context);

    /* const LocalScope *InstanceDeclScope() const */
    [get] varbinder.LocalScope InstanceDeclScopeConst(es2panda_Context context);

    /* uint32_t GetAndIncrementAnonymousClassIdx() const */
    [get] u32 GetAndIncrementAnonymousClassIdxConst(es2panda_Context context);

    /* void SetBindingProps(Decl *newDecl, BindingProps *props, bool isStatic) */
    [set] void SetBindingProps(es2panda_Context context, varbinder.Decl newDecl, es2panda_BindingProps props, boolean isStatic);
};

[Entity=Class, c_type=es2panda_Scope] interface AnnotationScope: ClassScope {

    /* explicit AnnotationScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.AnnotationScope Create(es2panda_Context context, varbinder.Scope parent);
};

[Entity=Class, c_type=es2panda_Scope] interface AnnotationParamScope: ParamScope {

    /* explicit AnnotationParamScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.AnnotationParamScope Create(es2panda_Context context, varbinder.Scope parent);
};

[Entity=Class, c_type=es2panda_Scope] interface CatchParamScope: ParamScope {

    /* explicit CatchParamScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.CatchParamScope Create(es2panda_Context context, varbinder.Scope parent);
};

[Entity=Class, c_type=es2panda_Scope] interface CatchScope {

    /* explicit CatchScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.CatchScope Create(es2panda_Context context, varbinder.Scope parent);
};

[Entity=Class, c_type=es2panda_Scope] interface LoopDeclarationScope: VariableScope {

    /* explicit LoopDeclarationScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.LoopDeclarationScope Create(es2panda_Context context, varbinder.Scope parent);

    /* Scope *InitScope() */
    varbinder.Scope InitScope(es2panda_Context context);

    /* void ConvertToVariableScope(ArenaAllocator *allocator) */
    void ConvertToVariableScope(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Scope] interface LoopScope: VariableScope {

    /* explicit LoopScope(ArenaAllocator *allocator, Scope *parent) */
    static varbinder.LoopScope Create(es2panda_Context context, varbinder.Scope parent);

    /* LoopDeclarationScope *DeclScope() */
    [get] varbinder.LoopDeclarationScope DeclScope(es2panda_Context context);

    /* void BindDecls(LoopDeclarationScope *declScope) */
    void BindDecls(es2panda_Context context, varbinder.LoopDeclarationScope declScope);

    /* void ConvertToVariableScope(ArenaAllocator *allocator) */
    void ConvertToVariableScope(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Scope] interface GlobalScope: FunctionScope {

    /* explicit GlobalScope(ArenaAllocator *allocator) */
    static varbinder.GlobalScope Create(es2panda_Context context);

    /* [[nodiscard]] bool IsForeignBinding(const util::StringView &name) const */
    boolean IsForeignBindingConst(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Scope] interface ModuleScope: GlobalScope {

    /* explicit ModuleScope(ArenaAllocator *allocator) */
    static varbinder.ModuleScope Create(es2panda_Context context);

    /* const LocalExportNameMap &LocalExports() const */
    [get] sequence<varbinder.Variable> LocalExportsConst(es2panda_Context context, sequence<sequence<String>> arenaMapValueArray);

    /* void AddImportDecl(ir::ImportDeclaration *importDecl, ImportDeclList &&decls) */
    [set] void AddImportDecl(es2panda_Context context, ir.ImportDeclaration importDecl, sequence<varbinder.ImportDecl> decls, u32 declsLen);

    /* void AddExportDecl(ir::AstNode *exportDecl, ExportDecl *decl) */
    [set] void AddExportDecl(es2panda_Context context, ir.AstNode exportDecl, varbinder.ExportDecl decl);

    /* void AddExportDecl(ir::AstNode *exportDecl, ExportDeclList &&decls) */
    [set] void AddExportDecl1(es2panda_Context context, ir.AstNode exportDecl, sequence<varbinder.ExportDecl> decls, u32 declsLen);

    /* bool ExportAnalysis() */
    boolean ExportAnalysis(es2panda_Context context);
};

[Entity=Class] interface VarBinder {
};

[Entity=Class] interface ETSBinder {

    /* void ResolveReferenceForScope(ir::AstNode *node, Scope *scope) */
    void ResolveReferenceForScope(es2panda_Context context, ir.AstNode node, varbinder.Scope scope);

    /* void ResolveReferencesForScope(ir::AstNode const *parent, Scope *scope) */
    void ResolveReferencesForScope(es2panda_Context context, ir.AstNode parent, varbinder.Scope scope);

    /* void ResolveReferencesForScopeWithContext(ir::AstNode *node, Scope *scope) */
    void ResolveReferencesForScopeWithContext(es2panda_Context context, ir.AstNode node, varbinder.Scope scope);
};

[Entity=Class, c_type=es2panda_Declaration] interface Decl {

    /* virtual DeclType Type() const = 0 */
    Es2pandaDeclType TypeConst(es2panda_Context context);

    /* const util::StringView &Name() const */
    [get] String NameConst(es2panda_Context context);

    /* ir::AstNode *Node() */
    [get] ir.AstNode Node(es2panda_Context context);

    /* const ir::AstNode *Node() const */
    [get] ir.AstNode NodeConst(es2panda_Context context);

    /* void BindNode(ir::AstNode *node) */
    void BindNode(es2panda_Context context, ir.AstNode node);

    /* bool IsLetOrConstDecl() const */
    [get] boolean IsLetOrConstDeclConst(es2panda_Context context);

    /* bool PossibleTDZ() const */
    [get] boolean PossibleTDZConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Declaration] interface EnumLiteralDecl: Decl {

    /* explicit EnumLiteralDecl(util::StringView name, bool isConst) */
    static varbinder.EnumLiteralDecl Create(es2panda_Context context, String name, boolean isConst);

    /* explicit EnumLiteralDecl(util::StringView name, ir::AstNode *declNode, bool isConst) */
    static varbinder.EnumLiteralDecl Create1(es2panda_Context context, String name, ir.AstNode declNode, boolean isConst);

    /* bool IsConst() const */
    [get] boolean IsConstConst(es2panda_Context context);

    /* void BindScope(LocalScope *scope) */
    void BindScope(es2panda_Context context, varbinder.LocalScope scope);

    /* LocalScope *Scope() */
    [get] varbinder.LocalScope Scope(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Declaration] interface InterfaceDecl: ir.TSInterfaceDeclaration {

    /* explicit InterfaceDecl(ArenaAllocator *allocator, util::StringView name) */
    static varbinder.InterfaceDecl Create(es2panda_Context context, String name);

    /* explicit InterfaceDecl(ArenaAllocator *allocator, util::StringView name, ir::AstNode *declNode) */
    static varbinder.InterfaceDecl Create1(es2panda_Context context, String name, ir.AstNode declNode);
};

[Entity=Class, c_type=es2panda_Declaration] interface ClassDecl: Decl {

    /* explicit ClassDecl(util::StringView name) */
    static varbinder.ClassDecl Create(es2panda_Context context, String name);

    /* explicit ClassDecl(util::StringView name, ir::AstNode *node) */
    static varbinder.ClassDecl Create1(es2panda_Context context, String name, ir.AstNode node);
};

[Entity=Class, c_type=es2panda_Declaration] interface FunctionDecl: ir.ScriptFunction {

    /* explicit FunctionDecl(ArenaAllocator *allocator, util::StringView name, ir::AstNode *node) */
    static varbinder.FunctionDecl Create(es2panda_Context context, String name, ir.AstNode node);
};

[Entity=Class, c_type=es2panda_Declaration] interface TypeParameterDecl: Decl {

    /* explicit TypeParameterDecl(util::StringView name) */
    static varbinder.TypeParameterDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface PropertyDecl: Decl {

    /* explicit PropertyDecl(util::StringView name) */
    static varbinder.PropertyDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface MethodDecl: Decl {

    /* explicit MethodDecl(util::StringView name) */
    static varbinder.MethodDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface EnumDecl: Decl {

    /* explicit EnumDecl(util::StringView name) */
    static varbinder.EnumDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface TypeAliasDecl: Decl {

    /* explicit TypeAliasDecl(util::StringView name) */
    static varbinder.TypeAliasDecl Create(es2panda_Context context, String name);

    /* explicit TypeAliasDecl(util::StringView name, ir::AstNode *node) */
    static varbinder.TypeAliasDecl Create1(es2panda_Context context, String name, ir.AstNode node);
};

[Entity=Class, c_type=es2panda_Declaration] interface NameSpaceDecl: Decl {

    /* explicit NameSpaceDecl(util::StringView name) */
    static varbinder.NameSpaceDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface VarDecl: Decl {

    /* explicit VarDecl(util::StringView name) */
    static varbinder.VarDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface LetDecl: Decl {

    /* explicit LetDecl(util::StringView name) */
    static varbinder.LetDecl Create(es2panda_Context context, String name);

    /* explicit LetDecl(util::StringView name, ir::AstNode *declNode) */
    static varbinder.LetDecl Create1(es2panda_Context context, String name, ir.AstNode declNode);
};

[Entity=Class, c_type=es2panda_Declaration] interface ConstDecl: Decl {

    /* explicit ConstDecl(util::StringView name) */
    static varbinder.ConstDecl Create(es2panda_Context context, String name);

    /* explicit ConstDecl(util::StringView name, ir::AstNode *declNode) */
    static varbinder.ConstDecl Create1(es2panda_Context context, String name, ir.AstNode declNode);
};

[Entity=Class, c_type=es2panda_Declaration] interface LabelDecl: Decl {

    /* explicit LabelDecl(util::StringView name) */
    static varbinder.LabelDecl Create(es2panda_Context context, String name);

    /* explicit LabelDecl(util::StringView name, ir::AstNode *declNode) */
    static varbinder.LabelDecl Create1(es2panda_Context context, String name, ir.AstNode declNode);
};

[Entity=Class, c_type=es2panda_Declaration] interface ReadonlyDecl: Decl {

    /* explicit ReadonlyDecl(util::StringView name) */
    static varbinder.ReadonlyDecl Create(es2panda_Context context, String name);

    /* explicit ReadonlyDecl(util::StringView name, ir::AstNode *declNode) */
    static varbinder.ReadonlyDecl Create1(es2panda_Context context, String name, ir.AstNode declNode);
};

[Entity=Class, c_type=es2panda_Declaration] interface ParameterDecl: Decl {

    /* explicit ParameterDecl(util::StringView name) */
    static varbinder.ParameterDecl Create(es2panda_Context context, String name);
};

[Entity=Class, c_type=es2panda_Declaration] interface AnnotationDecl: Decl {

    /* explicit AnnotationDecl(util::StringView name) */
    static varbinder.AnnotationDecl Create(es2panda_Context context, String name);

    /* explicit AnnotationDecl(util::StringView name, ir::AstNode *node) */
    static varbinder.AnnotationDecl Create1(es2panda_Context context, String name, ir.AstNode node);
};

[Entity=Class, c_type=es2panda_Declaration] interface AnnotationUsage: Decl {

    /* explicit AnnotationUsage(util::StringView name) */
    static varbinder.AnnotationUsage Create(es2panda_Context context, String name);

    /* explicit AnnotationUsage(util::StringView name, ir::AstNode *node) */
    static varbinder.AnnotationUsage Create1(es2panda_Context context, String name, ir.AstNode node);
};

[Entity=Class, c_type=es2panda_Declaration] interface ImportDecl: Decl {

    /* explicit ImportDecl(util::StringView importName, util::StringView localName) */
    static varbinder.ImportDecl Create(es2panda_Context context, String importName, String localName);

    /* explicit ImportDecl(util::StringView importName, util::StringView localName, ir::AstNode *node) */
    static varbinder.ImportDecl Create1(es2panda_Context context, String importName, String localName, ir.AstNode node);

    /* const util::StringView &ImportName() const */
    [get] String ImportNameConst(es2panda_Context context);

    /* const util::StringView &LocalName() const */
    [get] String LocalNameConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_Declaration] interface ExportDecl: Decl {

    /* explicit ExportDecl(util::StringView exportName, util::StringView localName) */
    static varbinder.ExportDecl Create(es2panda_Context context, String exportName, String localName);

    /* explicit ExportDecl(util::StringView exportName, util::StringView localName, ir::AstNode *node) */
    static varbinder.ExportDecl Create1(es2panda_Context context, String exportName, String localName, ir.AstNode node);

    /* const util::StringView &ExportName() const */
    [get] String ExportNameConst(es2panda_Context context);

    /* const util::StringView &LocalName() const */
    [get] String LocalNameConst(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_RecordTable] interface RecordTable {

    /* explicit RecordTable(ArenaAllocator *allocator, parser::Program *program, RecordTableFlags flags) */
    static varbinder.RecordTable Create(es2panda_Context context, parser.Program program, Es2pandaRecordTableFlags flags);

    /* void Merge(RecordTable *other) */
    void Merge(es2panda_Context context, varbinder.RecordTable other);

    /* bool IsExternal() const */
    [get] boolean IsExternalConst(es2panda_Context context);

    /* ArenaSet<ir::ClassDefinition *> &ClassDefinitions() */
    [get] sequence<ir.ClassDefinition> ClassDefinitions(es2panda_Context context);

    /* const ArenaSet<ir::ClassDefinition *> &ClassDefinitions() const */
    [get] sequence<ir.ClassDefinition> ClassDefinitionsConst(es2panda_Context context);

    /* ArenaSet<ir::TSInterfaceDeclaration *> &InterfaceDeclarations() */
    [get] sequence<ir.TSInterfaceDeclaration> InterfaceDeclarations(es2panda_Context context);

    /* const ArenaSet<ir::TSInterfaceDeclaration *> &InterfaceDeclarations() const */
    [get] sequence<ir.TSInterfaceDeclaration> InterfaceDeclarationsConst(es2panda_Context context);

    /* ArenaSet<ir::AnnotationDeclaration *> &AnnotationDeclarations() */
    [get] sequence<ir.AnnotationDeclaration> AnnotationDeclarations(es2panda_Context context);

    /* const ArenaSet<ir::AnnotationDeclaration *> &AnnotationDeclarations() const */
    [get] sequence<ir.AnnotationDeclaration> AnnotationDeclarationsConst(es2panda_Context context);

    /* void SetClassDefinition(ir::ClassDefinition *classDefinition) */
    [set] void SetClassDefinition(es2panda_Context context, ir.ClassDefinition classDefinition);

    /* ir::ClassDefinition *ClassDefinition() */
    [get] ir.ClassDefinition ClassDefinition(es2panda_Context context);

    /* const ir::ClassDefinition *ClassDefinition() const */
    [get] ir.ClassDefinition ClassDefinitionConst(es2panda_Context context);

    /* void SetInterfaceDeclaration(ir::TSInterfaceDeclaration *interfaceDeclaration) */
    [set] void SetInterfaceDeclaration(es2panda_Context context, ir.TSInterfaceDeclaration interfaceDeclaration);

    /* ir::TSInterfaceDeclaration *InterfaceDeclaration() */
    [get] ir.TSInterfaceDeclaration InterfaceDeclaration(es2panda_Context context);

    /* const ir::TSInterfaceDeclaration *InterfaceDeclaration() const */
    [get] ir.TSInterfaceDeclaration InterfaceDeclarationConst(es2panda_Context context);

    /* void SetAnnotationDeclaration(ir::AnnotationDeclaration *annotationDeclaration) */
    [set] void SetAnnotationDeclaration(es2panda_Context context, ir.AnnotationDeclaration annotationDeclaration);

    /* ir::AnnotationDeclaration *AnnotationDeclaration() */
    [get] ir.AnnotationDeclaration AnnotationDeclaration(es2panda_Context context);

    /* const ir::AnnotationDeclaration *AnnotationDeclaration() const */
    [get] ir.AnnotationDeclaration AnnotationDeclarationConst(es2panda_Context context);

    /* void SetProgram(parser::Program *program) */
    [set] void SetProgram(es2panda_Context context, parser.Program program);

    /* parser::Program *Program() */
    [get] parser.Program Program(es2panda_Context context);

    /* const parser::Program *Program() const */
    [get] parser.Program ProgramConst(es2panda_Context context);

    /* util::StringView RecordName() const */
    String RecordNameConst(es2panda_Context context);

    /* void CleanUp() */
    void CleanUp(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_BoundContext] interface BoundContext {

    /* util::StringView FormRecordName() const */
    String FormRecordNameConst(es2panda_Context context);
};

};  // namespace varbinder

namespace parser {

[Entity=Class] interface ETSParser {

    /* Program *GetGlobalProgram() const */
    parser.Program GetGlobalProgramConst(es2panda_Context context);

    /* util::ImportPathManager *GetImportPathManager() */
    [get] util.ImportPathManager GetImportPathManager(es2panda_Context context);

    /* void AddDirectImportsToDirectExternalSources(const std::vector<Program *> &directImportsFromMainSource) const */
    [set] void AddDirectImportsToDirectExternalSourcesConst(es2panda_Context context, sequence<parser.Program> directImportsFromMainSource, u32 directImportsFromMainSourceLen);

    /* std::string_view FormattingFileName() */
    [get] String FormattingFileName(es2panda_Context context);

    /* ir::TypeNode *CreateFormattedTypeAnnotation(std::string_view const sourceCode) */
    ir.TypeNode CreateFormattedTypeAnnotation(es2panda_Context context, String sourceCode);

    /* ir::TypeNode *CreateFormattedTypeAnnotation(std::string_view sourceCode, std::vector<ir::AstNode *> &args) */
    ir.TypeNode CreateFormattedTypeAnnotation1(es2panda_Context context, String sourceCode, sequence<ir.AstNode> args, u32 argsLen);

    /* ir::Expression *CreateExpression(std::string_view sourceCode,
                                     ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) */
    ir.Expression CreateExpression(es2panda_Context context, String sourceCode, Es2pandaExpressionParseFlags flags);

    /* ir::Expression *CreateFormattedExpression(std::string_view sourceCode, std::vector<ir::AstNode *> &insertingNodes) */
    ir.Expression CreateFormattedExpression(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* ir::Expression *CreateFormattedExpression(std::string_view const sourceCode, ArenaVector<ir::Expression *> &args) */
    ir.Expression CreateFormattedExpression1(es2panda_Context context, String sourceCode, sequence<ir.Expression> args, u32 argsLen);

    /* ir::Expression *CreateFormattedExpression(std::string_view const sourceCode, std::vector<ir::Expression *> &args) */
    ir.Expression CreateFormattedExpression2(es2panda_Context context, String sourceCode, sequence<ir.Expression> args, u32 argsLen);

    /* ir::Statement *CreateFormattedStatement(std::string_view sourceCode, std::vector<ir::AstNode *> &insertingNodes) */
    ir.Statement CreateFormattedStatement(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* ArenaVector<ir::Statement *> CreateStatements(std::string_view sourceCode) */
    sequence<ir.Statement> CreateStatements(es2panda_Context context, String sourceCode);

    /* ArenaVector<ir::Statement *> CreateFormattedStatements(std::string_view sourceCode,
                                                           std::vector<ir::AstNode *> &insertingNodes) */
    sequence<ir.Statement> CreateFormattedStatements(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* ir::Statement *ParseTopLevelAnnotation(ir::ModifierFlags memberModifiers) */
    ir.Statement ParseTopLevelAnnotation(es2panda_Context context, Es2pandaModifierFlags memberModifiers);

    /* ArenaVector<ir::AnnotationUsage *> ParseAnnotations(bool isTopLevelSt) */
    sequence<ir.AnnotationUsage> ParseAnnotations(es2panda_Context context, boolean isTopLevelSt);

    /* ir::Statement *CreateFormattedClassDeclaration(std::string_view sourceCode,
                                                   std::vector<ir::AstNode *> &insertingNodes,
                                                   bool allowStatic = false) */
    ir.Statement CreateFormattedClassDeclaration(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen, boolean allowStatic);

    /* ir::AstNode *CreateFormattedClassElement(std::string_view sourceCode, std::vector<ir::AstNode *> &insertingNodes,
                                             const ArenaVector<ir::AstNode *> &properties,
                                             ir::ClassDefinitionModifiers modifiers) */
    ir.AstNode CreateFormattedClassElement(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen, sequence<ir.AstNode> properties, u32 propertiesLen, Es2pandaClassDefinitionModifiers modifiers);

    /* ir::AstNode *CreateFormattedClassFieldDefinition(std::string_view sourceCode,
                                                     std::vector<ir::AstNode *> &insertingNodes) */
    ir.AstNode CreateFormattedClassFieldDefinition(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* ir::AstNode *CreateFormattedClassMethodDefinition(std::string_view sourceCode,
                                                      std::vector<ir::AstNode *> &insertingNodes) */
    ir.AstNode CreateFormattedClassMethodDefinition(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* ir::Statement *CreateFormattedTopLevelStatement(std::string_view sourceCode,
                                                    std::vector<ir::AstNode *> &insertingNodes) */
    ir.Statement CreateFormattedTopLevelStatement(es2panda_Context context, String sourceCode, sequence<ir.AstNode> insertingNodes, u32 insertingNodesLen);

    /* void ApplyAnnotationsToNode(ir::AstNode *node, ArenaVector<ir::AnnotationUsage *> &&annotations,
                                lexer::SourcePosition pos,
                                TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::NO_OPTS) */
    void ApplyAnnotationsToNode(es2panda_Context context, ir.AstNode node, sequence<ir.AnnotationUsage> annotations, u32 annotationsLen, es2panda_SourcePosition pos, Es2pandaTypeAnnotationParsingOptions options);

    /* [[nodiscard]] bool IsInitializerBlockStart() const */
    boolean IsInitializerBlockStartConst(es2panda_Context context);

    /* ir::ETSImportDeclaration *BuildImportDeclaration(ir::ImportKinds importKind,
                                                     ArenaVector<ir::AstNode *> &&specifiers,
                                                     ir::StringLiteral *pathToResolve, parser::Program *program) */
    ir.ETSImportDeclaration BuildImportDeclaration(es2panda_Context context, Es2pandaImportKinds importKind, sequence<ir.AstNode> specifiers, u32 specifiersLen, ir.StringLiteral pathToResolve, parser.Program program);

    /* void ParseSources() */
    void ParseSources(es2panda_Context context);

    /* void ParseInSimultMode() */
    void ParseInSimultMode(es2panda_Context context);
};

[Entity=Class, c_type=es2panda_RecordTableHolder] interface RecordTableHolder {

    /* void SetRecordTable(varbinder::RecordTable *recordTable) */
    [set] void SetRecordTable(es2panda_Context context, varbinder.RecordTable recordTable);
};

[Entity=Class, c_type=es2panda_Program] interface Program {

    /* void PushVarBinder(varbinder::VarBinder *varbinder) */
    void PushVarBinder(es2panda_Context context);

    /* void PushChecker(checker::Checker *checker) */
    void PushChecker(es2panda_Context context);

    /* std::string_view SourceCode() const */
    [get] String SourceCodeConst(es2panda_Context context);

    /* util::StringView SourceFilePath() const */
    [get] String SourceFilePathConst(es2panda_Context context);

    /* const util::Path &SourceFile() const */
    [get] util.Path SourceFileConst(es2panda_Context context);

    /* util::StringView FileName() const */
    [get] String FileNameConst(es2panda_Context context);

    /* util::StringView FileNameWithExtension() const */
    [get] String FileNameWithExtensionConst(es2panda_Context context);

    /* util::StringView AbsoluteName() const */
    [get] String AbsoluteNameConst(es2panda_Context context);

    /* std::string RelativeFilePath(const public_lib::Context *context) const */
    String RelativeFilePathConst(es2panda_Context context);

    /* ir::BlockStatement *Ast() */
    [get] ir.BlockStatement Ast(es2panda_Context context);

    /* const ir::BlockStatement *Ast() const */
    [get] ir.BlockStatement AstConst(es2panda_Context context);

    /* void SetAst(ir::BlockStatement *ast) */
    [set] void SetAst(es2panda_Context context, ir.BlockStatement ast);

    /* ir::ClassDefinition *GlobalClass() */
    ir.ClassDefinition GlobalClass(es2panda_Context context);

    /* const ir::ClassDefinition *GlobalClass() const */
    ir.ClassDefinition GlobalClassConst(es2panda_Context context);

    /* void SetGlobalClass(ir::ClassDefinition *globalClass) */
    [set] void SetGlobalClass(es2panda_Context context, ir.ClassDefinition globalClass);

    /* void PromoteToMainProgram(public_lib::Context *ctx) */
    void PromoteToMainProgram(es2panda_Context context);

    /* const lexer::SourcePosition &PackageStart() const */
    [get] es2panda_SourcePosition PackageStartConst(es2panda_Context context);

    /* void SetPackageStart(const lexer::SourcePosition &start) */
    [set] void SetPackageStart(es2panda_Context context, es2panda_SourcePosition start);

    /* void SetPackageInfo(std::string_view mname, util::ModuleKind kind) */
    [set] void SetPackageInfo(es2panda_Context context, String mname, Es2pandaModuleKind kind);

    /* std::string_view ModuleName() const */
    [get] String ModuleNameConst(es2panda_Context context);

    /* std::string_view ModulePrefix() const */
    [get] String ModulePrefixConst(es2panda_Context context);

    /* virtual util::ModuleKind GetModuleKind() const */
    [get] Es2pandaModuleKind GetModuleKindConst(es2panda_Context context);

    /* bool IsDeclForDynamicStaticInterop() const */
    [get] boolean IsDeclForDynamicStaticInteropConst(es2panda_Context context);

    /* bool IsDeclarationModule() const */
    [get] boolean IsDeclarationModuleConst(es2panda_Context context);

    /* void SetASTChecked() */
    [set] void SetASTChecked(es2panda_Context context);

    /* void RemoveAstChecked() */
    void RemoveAstChecked(es2panda_Context context);

    /* bool IsASTChecked() */
    boolean IsASTChecked(es2panda_Context context);

    /* void MarkASTAsLowered() */
    void MarkASTAsLowered(es2panda_Context context);

    /* bool IsASTLowered() const */
    [get] boolean IsASTLoweredConst(es2panda_Context context);

    /* void SetProgramModified(bool isModified) */
    [set] void SetProgramModified(es2panda_Context context, boolean isModified);

    /* bool IsProgramModified() const */
    [get] boolean IsProgramModifiedConst(es2panda_Context context);

    /* bool IsStdLib() const */
    [get] boolean IsStdLibConst(es2panda_Context context);

    /* bool IsGenAbcForExternal() const */
    boolean IsGenAbcForExternalConst(es2panda_Context context);

    /* void SetGenAbcForExternalSources(bool genAbc = true) */
    [set] void SetGenAbcForExternalSources(es2panda_Context context, boolean genAbc);

    /* varbinder::ClassScope *GlobalClassScope() */
    varbinder.ClassScope GlobalClassScope(es2panda_Context context);

    /* const varbinder::ClassScope *GlobalClassScope() const */
    varbinder.ClassScope GlobalClassScopeConst(es2panda_Context context);

    /* varbinder::GlobalScope *GlobalScope() */
    varbinder.GlobalScope GlobalScope(es2panda_Context context);

    /* const varbinder::GlobalScope *GlobalScope() const */
    varbinder.GlobalScope GlobalScopeConst(es2panda_Context context);

    /* std::string Dump() const */
    String DumpConst(es2panda_Context context);

    /* void DumpSilent() const */
    void DumpSilentConst(es2panda_Context context);

    /* bool IsDied() const */
    boolean IsDiedConst(es2panda_Context context);

    /* void AddFileDependencies(std::string_view file, std::string_view depFile) */
    [set] void AddFileDependencies(es2panda_Context context, String file, String depFile);

    /* void SetRecordTable(varbinder::RecordTable *recordTable) */
    [set] void SetRecordTable(es2panda_Context context, varbinder.RecordTable recordTable);
};

};  // namespace parser

namespace util {

[Entity=Class, c_type=es2panda_Options] interface Options: gen.Options {

    /* explicit Options(std::string_view execPath, util::DiagnosticEngine &diagnosticEngine) */
    static util.Options Create(es2panda_Context context, String execPath, es2panda_ErrorLogger diagnosticEngine);

    /* const ArkTsConfig &ArkTSConfig() const */
    [get] es2panda.ArkTsConfig ArkTSConfigConst(es2panda_Context context);

    /* void DetermineCompilationMode() */
    void DetermineCompilationMode(es2panda_Context context);

    /* CompilationMode GetCompilationMode() const */
    [get] Es2pandaCompilationMode GetCompilationModeConst(es2panda_Context context);

    /* void InitForEval() */
    void InitForEval(es2panda_Context context);

    /* void SetEvalMode(std::string_view evalModeStr) */
    [set] void SetEvalMode(es2panda_Context context, String evalModeStr);

    /* bool IsEval() const */
    [get] boolean IsEvalConst(es2panda_Context context);

    /* bool IsDirectEval() const */
    [get] boolean IsDirectEvalConst(es2panda_Context context);

    /* bool IsFunctionEval() const */
    [get] boolean IsFunctionEvalConst(es2panda_Context context);

    /* std::string SourceFileName() const */
    [get] String SourceFileNameConst(es2panda_Context context);

    /* bool IsDynamic() const */
    [get] boolean IsDynamicConst(es2panda_Context context);

    /* const std::set<std::string> &GetSkipPhases() const */
    [get] sequence<String> GetSkipPhasesConst(es2panda_Context context);

    /* const std::set<std::string> &GetDumpBeforePhases() const */
    [get] sequence<String> GetDumpBeforePhasesConst(es2panda_Context context);

    /* const std::set<std::string> &GetDumpEtsSrcBeforePhases() const */
    [get] sequence<String> GetDumpEtsSrcBeforePhasesConst(es2panda_Context context);

    /* const std::set<std::string> &GetDumpAfterPhases() const */
    [get] sequence<String> GetDumpAfterPhasesConst(es2panda_Context context);

    /* const std::set<std::string> &GetDumpEtsSrcAfterPhases() const */
    [get] sequence<String> GetDumpEtsSrcAfterPhasesConst(es2panda_Context context);

    /* bool IsAstVerifierBeforePhases() const */
    [get] boolean IsAstVerifierBeforePhasesConst(es2panda_Context context);

    /* bool IsAstVerifierEachPhase() const */
    [get] boolean IsAstVerifierEachPhaseConst(es2panda_Context context);

    /* bool IsAstVerifierAfterPhases() const */
    [get] boolean IsAstVerifierAfterPhasesConst(es2panda_Context context);

    /* bool HasVerifierPhase(std::string_view phase) const */
    [get] boolean HasVerifierPhaseConst(es2panda_Context context, String phase);
};

[Entity=Class, c_type=es2panda_ImportPathManager] interface ImportPathManager {

    /* void ClearParseList() */
    void ClearParseList(es2panda_Context context);

    /* parser::Program *GatherImportMetadata(parser::Program *importer, ir::StringLiteral *importPath) */
    parser.Program GatherImportMetadata(es2panda_Context context, parser.Program importer, ir.StringLiteral importPath);

    /* parser::Program *EnsurePackageIsRegisteredByPackageFraction(parser::Program *fraction,
                                                                ir::ETSPackageDeclaration *packageDecl) */
    parser.Program EnsurePackageIsRegisteredByPackageFraction(es2panda_Context context, parser.Program fraction, ir.ETSPackageDeclaration packageDecl);

    /* util::StringView ResolvePathAPI(parser::Program *importer, ir::StringLiteral *importPath) const */
    String ResolvePathAPIConst(es2panda_Context context, parser.Program importer, ir.StringLiteral importPath);

    /* const ArkTsConfig &ArkTSConfig() const */
    es2panda.ArkTsConfig ArkTSConfigConst(es2panda_Context context);

    /* void InitParseQueueForSimult() */
    void InitParseQueueForSimult(es2panda_Context context);

    /* void IntroduceMainProgramForSimult() */
    void IntroduceMainProgramForSimult(es2panda_Context context);

    /* void SetupGlobalProgram() */
    [set] void SetupGlobalProgram(es2panda_Context context);

    /* parser::Program *SetupProgramForDebugInfoPlugin(std::string_view sourceFilePath, std::string_view moduleName) */
    [set] parser.Program SetupProgramForDebugInfoPlugin(es2panda_Context context, String sourceFilePath, String moduleName);
};

[Entity=Class, c_type=es2panda_Path] interface Path {

    /* explicit Path(ArenaAllocator *allocator) */
    static util.Path Create(es2panda_Context context);

    /* explicit Path(const std::string &absolutePath, ArenaAllocator *allocator) */
    static util.Path Create1(es2panda_Context context, String absolutePath);

    /* explicit Path(const std::string &relativePath, const std::string &basePath, ArenaAllocator *allocator) */
    static util.Path Create2(es2panda_Context context, String relativePath, String basePath);

    /* explicit Path(const util::StringView &absolutePath, ArenaAllocator *allocator) */
    static util.Path Create3(es2panda_Context context, String absolutePath);

    /* explicit Path(const util::StringView &relativePath, const util::StringView &basePath, ArenaAllocator *allocator) */
    static util.Path Create4(es2panda_Context context, String relativePath, String basePath);

    /* bool IsRelative() */
    boolean IsRelative(es2panda_Context context);

    /* bool IsAbsolute() */
    boolean IsAbsolute(es2panda_Context context);

    /* const util::StringView &GetPath() const */
    String GetPathConst(es2panda_Context context);

    /* const util::StringView &GetAbsolutePath() const */
    String GetAbsolutePathConst(es2panda_Context context);

    /* const util::StringView &GetExtension() const */
    String GetExtensionConst(es2panda_Context context);

    /* const util::StringView &GetFileName() const */
    String GetFileNameConst(es2panda_Context context);

    /* const util::StringView &GetFileNameWithExtension() const */
    String GetFileNameWithExtensionConst(es2panda_Context context);

    /* const util::StringView &GetParentFolder() const */
    String GetParentFolderConst(es2panda_Context context);

    /* const util::StringView &GetAbsoluteParentFolder() const */
    String GetAbsoluteParentFolderConst(es2panda_Context context);

    /* constexpr static char GetPathDelimiter() */
    [get] i8 GetPathDelimiter(es2panda_Context context);
};

};  // namespace util

namespace gen {

[Entity=Class, c_type=es2panda_Options] interface Options {

    /* explicit Options(const std::string &exe_path) */
    static util.Options Create(es2panda_Context context, String exe_path);

    /* bool IsHelp([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsHelpConst(es2panda_Context context, String lang);

    /* void SetHelp(bool value) */
    [set] void SetHelp(es2panda_Context context, boolean value);

    /* bool WasSetHelp([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetHelpConst(es2panda_Context context, String lang);

    /* bool IsVersion([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsVersionConst(es2panda_Context context, String lang);

    /* void SetVersion(bool value) */
    [set] void SetVersion(es2panda_Context context, boolean value);

    /* bool WasSetVersion([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetVersionConst(es2panda_Context context, String lang);

    /* const std::string &GetArktsconfig([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetArktsconfigConst(es2panda_Context context, String lang);

    /* bool WasSetArktsconfig([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetArktsconfigConst(es2panda_Context context, String lang);

    /* const std::string &GetExtension([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetExtensionConst(es2panda_Context context, String lang);

    /* bool WasSetExtension([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetExtensionConst(es2panda_Context context, String lang);

    /* bool IsModule([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsModuleConst(es2panda_Context context, String lang);

    /* void SetModule(bool value) */
    [set] void SetModule(es2panda_Context context, boolean value);

    /* bool WasSetModule([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetModuleConst(es2panda_Context context, String lang);

    /* bool IsParseOnly([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsParseOnlyConst(es2panda_Context context, String lang);

    /* void SetParseOnly(bool value) */
    [set] void SetParseOnly(es2panda_Context context, boolean value);

    /* bool WasSetParseOnly([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetParseOnlyConst(es2panda_Context context, String lang);

    /* const std::string &GetDumpAstOutput([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetDumpAstOutputConst(es2panda_Context context, String lang);

    /* bool WasSetDumpAstOutput([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpAstOutputConst(es2panda_Context context, String lang);

    /* bool IsDumpAst([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpAstConst(es2panda_Context context, String lang);

    /* void SetDumpAst(bool value) */
    [set] void SetDumpAst(es2panda_Context context, boolean value);

    /* bool WasSetDumpAst([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpAstConst(es2panda_Context context, String lang);

    /* bool IsDumpCfg([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpCfgConst(es2panda_Context context, String lang);

    /* void SetDumpCfg(bool value) */
    [set] void SetDumpCfg(es2panda_Context context, boolean value);

    /* bool WasSetDumpCfg([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpCfgConst(es2panda_Context context, String lang);

    /* bool IsDumpDynamicAst([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpDynamicAstConst(es2panda_Context context, String lang);

    /* void SetDumpDynamicAst(bool value) */
    [set] void SetDumpDynamicAst(es2panda_Context context, boolean value);

    /* bool WasSetDumpDynamicAst([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpDynamicAstConst(es2panda_Context context, String lang);

    /* bool IsDumpAstOnlySilent([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpAstOnlySilentConst(es2panda_Context context, String lang);

    /* void SetDumpAstOnlySilent(bool value) */
    [set] void SetDumpAstOnlySilent(es2panda_Context context, boolean value);

    /* bool WasSetDumpAstOnlySilent([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpAstOnlySilentConst(es2panda_Context context, String lang);

    /* bool IsListFiles([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsListFilesConst(es2panda_Context context, String lang);

    /* void SetListFiles(bool value) */
    [set] void SetListFiles(es2panda_Context context, boolean value);

    /* bool WasSetListFiles([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetListFilesConst(es2panda_Context context, String lang);

    /* bool IsDumpAssembly([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpAssemblyConst(es2panda_Context context, String lang);

    /* void SetDumpAssembly(bool value) */
    [set] void SetDumpAssembly(es2panda_Context context, boolean value);

    /* bool WasSetDumpAssembly([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpAssemblyConst(es2panda_Context context, String lang);

    /* bool IsDebugInfo([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDebugInfoConst(es2panda_Context context, String lang);

    /* void SetDebugInfo(bool value) */
    [set] void SetDebugInfo(es2panda_Context context, boolean value);

    /* bool WasSetDebugInfo([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDebugInfoConst(es2panda_Context context, String lang);

    /* bool IsDumpDebugInfo([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpDebugInfoConst(es2panda_Context context, String lang);

    /* void SetDumpDebugInfo(bool value) */
    [set] void SetDumpDebugInfo(es2panda_Context context, boolean value);

    /* bool WasSetDumpDebugInfo([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpDebugInfoConst(es2panda_Context context, String lang);

    /* int GetOptLevel([[maybe_unused]] std::string_view lang = "") const */
    [get] i32 GetOptLevelConst(es2panda_Context context, String lang);

    /* void SetOptLevel(int value) */
    [set] void SetOptLevel(es2panda_Context context, i32 value);

    /* bool WasSetOptLevel([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetOptLevelConst(es2panda_Context context, String lang);

    /* bool IsEtsModule([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEtsModuleConst(es2panda_Context context, String lang);

    /* void SetEtsModule(bool value) */
    [set] void SetEtsModule(es2panda_Context context, boolean value);

    /* bool WasSetEtsModule([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsModuleConst(es2panda_Context context, String lang);

    /* const std::string &GetEvalMode([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetEvalModeConst(es2panda_Context context, String lang);

    /* bool WasSetEvalMode([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEvalModeConst(es2panda_Context context, String lang);

    /* bool IsEtsWarningsWerror([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEtsWarningsWerrorConst(es2panda_Context context, String lang);

    /* void SetEtsWarningsWerror(bool value) */
    [set] void SetEtsWarningsWerror(es2panda_Context context, boolean value);

    /* bool WasSetEtsWarningsWerror([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsWarningsWerrorConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetEtsWarningsEnable([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetEtsWarningsEnableConst(es2panda_Context context, String lang);

    /* void SetEtsWarningsEnable(arg_list_t value) */
    [set] void SetEtsWarningsEnable(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetEtsWarningsEnable([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsWarningsEnableConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetEtsWarningsDisable([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetEtsWarningsDisableConst(es2panda_Context context, String lang);

    /* void SetEtsWarningsDisable(arg_list_t value) */
    [set] void SetEtsWarningsDisable(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetEtsWarningsDisable([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsWarningsDisableConst(es2panda_Context context, String lang);

    /* const std::string &GetEtsWarningsBasePath([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetEtsWarningsBasePathConst(es2panda_Context context, String lang);

    /* bool WasSetEtsWarningsBasePath([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsWarningsBasePathConst(es2panda_Context context, String lang);

    /* bool IsEtsWarnings([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEtsWarningsConst(es2panda_Context context, String lang);

    /* void SetEtsWarnings(bool value) */
    [set] void SetEtsWarnings(es2panda_Context context, boolean value);

    /* bool WasSetEtsWarnings([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsWarningsConst(es2panda_Context context, String lang);

    /* uint64_t GetDebuggerEvalLine([[maybe_unused]] std::string_view lang = "") const */
    [get] u64 GetDebuggerEvalLineConst(es2panda_Context context, String lang);

    /* void SetDebuggerEvalLine(uint64_t value) */
    [set] void SetDebuggerEvalLine(es2panda_Context context, u64 value);

    /* bool WasSetDebuggerEvalLine([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDebuggerEvalLineConst(es2panda_Context context, String lang);

    /* const std::string &GetDebuggerEvalSource([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetDebuggerEvalSourceConst(es2panda_Context context, String lang);

    /* bool WasSetDebuggerEvalSource([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDebuggerEvalSourceConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetDebuggerEvalPandaFiles([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetDebuggerEvalPandaFilesConst(es2panda_Context context, String lang);

    /* void SetDebuggerEvalPandaFiles(arg_list_t value) */
    [set] void SetDebuggerEvalPandaFiles(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetDebuggerEvalPandaFiles([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDebuggerEvalPandaFilesConst(es2panda_Context context, String lang);

    /* bool IsDebuggerEval([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDebuggerEvalConst(es2panda_Context context, String lang);

    /* void SetDebuggerEval(bool value) */
    [set] void SetDebuggerEval(es2panda_Context context, boolean value);

    /* bool WasSetDebuggerEval([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDebuggerEvalConst(es2panda_Context context, String lang);

    /* bool IsGenerateDeclEnabled([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsGenerateDeclEnabledConst(es2panda_Context context, String lang);

    /* void SetGenerateDeclEnabled(bool value) */
    [set] void SetGenerateDeclEnabled(es2panda_Context context, boolean value);

    /* bool WasSetGenerateDeclEnabled([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetGenerateDeclEnabledConst(es2panda_Context context, String lang);

    /* const std::string &GetGenerateDeclPath([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetGenerateDeclPathConst(es2panda_Context context, String lang);

    /* bool WasSetGenerateDeclPath([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetGenerateDeclPathConst(es2panda_Context context, String lang);

    /* bool IsGenerateDecl([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsGenerateDeclConst(es2panda_Context context, String lang);

    /* void SetGenerateDecl(bool value) */
    [set] void SetGenerateDecl(es2panda_Context context, boolean value);

    /* bool WasSetGenerateDecl([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetGenerateDeclConst(es2panda_Context context, String lang);

    /* bool IsEmitDeclaration([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEmitDeclarationConst(es2panda_Context context, String lang);

    /* void SetEmitDeclaration(bool value) */
    [set] void SetEmitDeclaration(es2panda_Context context, boolean value);

    /* bool WasSetEmitDeclaration([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEmitDeclarationConst(es2panda_Context context, String lang);

    /* int GetThread([[maybe_unused]] std::string_view lang = "") const */
    [get] i32 GetThreadConst(es2panda_Context context, String lang);

    /* void SetThread(int value) */
    [set] void SetThread(es2panda_Context context, i32 value);

    /* bool WasSetThread([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetThreadConst(es2panda_Context context, String lang);

    /* bool IsDumpSizeStat([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpSizeStatConst(es2panda_Context context, String lang);

    /* void SetDumpSizeStat(bool value) */
    [set] void SetDumpSizeStat(es2panda_Context context, boolean value);

    /* bool WasSetDumpSizeStat([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpSizeStatConst(es2panda_Context context, String lang);

    /* const std::string &GetOutput([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetOutputConst(es2panda_Context context, String lang);

    /* bool WasSetOutput([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetOutputConst(es2panda_Context context, String lang);

    /* const std::string &GetLogLevel([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetLogLevelConst(es2panda_Context context, String lang);

    /* bool WasSetLogLevel([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetLogLevelConst(es2panda_Context context, String lang);

    /* const std::string &GetStdlib([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetStdlibConst(es2panda_Context context, String lang);

    /* bool WasSetStdlib([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetStdlibConst(es2panda_Context context, String lang);

    /* bool IsGenStdlib([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsGenStdlibConst(es2panda_Context context, String lang);

    /* void SetGenStdlib(bool value) */
    [set] void SetGenStdlib(es2panda_Context context, boolean value);

    /* bool WasSetGenStdlib([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetGenStdlibConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetPlugins([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetPluginsConst(es2panda_Context context, String lang);

    /* void SetPlugins(arg_list_t value) */
    [set] void SetPlugins(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetPlugins([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetPluginsConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetSkipPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetSkipPhasesConst(es2panda_Context context, String lang);

    /* void SetSkipPhases(arg_list_t value) */
    [set] void SetSkipPhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetSkipPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetSkipPhasesConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetAstVerifierWarnings([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetAstVerifierWarningsConst(es2panda_Context context, String lang);

    /* void SetAstVerifierWarnings(arg_list_t value) */
    [set] void SetAstVerifierWarnings(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetAstVerifierWarnings([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierWarningsConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetAstVerifierErrors([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetAstVerifierErrorsConst(es2panda_Context context, String lang);

    /* void SetAstVerifierErrors(arg_list_t value) */
    [set] void SetAstVerifierErrors(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetAstVerifierErrors([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierErrorsConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetAstVerifierPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetAstVerifierPhasesConst(es2panda_Context context, String lang);

    /* void SetAstVerifierPhases(arg_list_t value) */
    [set] void SetAstVerifierPhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetAstVerifierPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierPhasesConst(es2panda_Context context, String lang);

    /* bool IsAstVerifierFullProgram([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsAstVerifierFullProgramConst(es2panda_Context context, String lang);

    /* void SetAstVerifierFullProgram(bool value) */
    [set] void SetAstVerifierFullProgram(es2panda_Context context, boolean value);

    /* bool WasSetAstVerifierFullProgram([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierFullProgramConst(es2panda_Context context, String lang);

    /* bool IsAstVerifierJson([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsAstVerifierJsonConst(es2panda_Context context, String lang);

    /* void SetAstVerifierJson(bool value) */
    [set] void SetAstVerifierJson(es2panda_Context context, boolean value);

    /* bool WasSetAstVerifierJson([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierJsonConst(es2panda_Context context, String lang);

    /* const std::string &GetAstVerifierJsonPath([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetAstVerifierJsonPathConst(es2panda_Context context, String lang);

    /* bool WasSetAstVerifierJsonPath([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierJsonPathConst(es2panda_Context context, String lang);

    /* bool IsAstVerifier([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsAstVerifierConst(es2panda_Context context, String lang);

    /* void SetAstVerifier(bool value) */
    [set] void SetAstVerifier(es2panda_Context context, boolean value);

    /* bool WasSetAstVerifier([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetAstVerifierConst(es2panda_Context context, String lang);

    /* bool IsListPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsListPhasesConst(es2panda_Context context, String lang);

    /* void SetListPhases(bool value) */
    [set] void SetListPhases(es2panda_Context context, boolean value);

    /* bool WasSetListPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetListPhasesConst(es2panda_Context context, String lang);

    /* bool IsEtsUnnamed([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEtsUnnamedConst(es2panda_Context context, String lang);

    /* void SetEtsUnnamed(bool value) */
    [set] void SetEtsUnnamed(es2panda_Context context, boolean value);

    /* bool WasSetEtsUnnamed([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsUnnamedConst(es2panda_Context context, String lang);

    /* const std::string &GetEtsPath([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetEtsPathConst(es2panda_Context context, String lang);

    /* bool WasSetEtsPath([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsPathConst(es2panda_Context context, String lang);

    /* const std::string &GetExitBeforePhase([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetExitBeforePhaseConst(es2panda_Context context, String lang);

    /* bool WasSetExitBeforePhase([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetExitBeforePhaseConst(es2panda_Context context, String lang);

    /* const std::string &GetExitAfterPhase([[maybe_unused]] std::string_view lang = "") const */
    [get] String GetExitAfterPhaseConst(es2panda_Context context, String lang);

    /* bool WasSetExitAfterPhase([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetExitAfterPhaseConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetDumpBeforePhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetDumpBeforePhasesConst(es2panda_Context context, String lang);

    /* void SetDumpBeforePhases(arg_list_t value) */
    [set] void SetDumpBeforePhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetDumpBeforePhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpBeforePhasesConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetDumpAfterPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetDumpAfterPhasesConst(es2panda_Context context, String lang);

    /* void SetDumpAfterPhases(arg_list_t value) */
    [set] void SetDumpAfterPhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetDumpAfterPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpAfterPhasesConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetDumpEtsSrcBeforePhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetDumpEtsSrcBeforePhasesConst(es2panda_Context context, String lang);

    /* void SetDumpEtsSrcBeforePhases(arg_list_t value) */
    [set] void SetDumpEtsSrcBeforePhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetDumpEtsSrcBeforePhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpEtsSrcBeforePhasesConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetDumpEtsSrcAfterPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetDumpEtsSrcAfterPhasesConst(es2panda_Context context, String lang);

    /* void SetDumpEtsSrcAfterPhases(arg_list_t value) */
    [set] void SetDumpEtsSrcAfterPhases(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetDumpEtsSrcAfterPhases([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpEtsSrcAfterPhasesConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetBcoOptimizer([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetBcoOptimizerConst(es2panda_Context context, String lang);

    /* void SetBcoOptimizer(arg_list_t value) */
    [set] void SetBcoOptimizer(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetBcoOptimizer([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetBcoOptimizerConst(es2panda_Context context, String lang);

    /* const arg_list_t &GetBcoCompiler([[maybe_unused]] std::string_view lang = "") const */
    [get] sequence<String> GetBcoCompilerConst(es2panda_Context context, String lang);

    /* void SetBcoCompiler(arg_list_t value) */
    [set] void SetBcoCompiler(es2panda_Context context, sequence<String> value, u32 valueLen);

    /* bool WasSetBcoCompiler([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetBcoCompilerConst(es2panda_Context context, String lang);

    /* bool IsDumpPerfMetrics([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsDumpPerfMetricsConst(es2panda_Context context, String lang);

    /* void SetDumpPerfMetrics(bool value) */
    [set] void SetDumpPerfMetrics(es2panda_Context context, boolean value);

    /* bool WasSetDumpPerfMetrics([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetDumpPerfMetricsConst(es2panda_Context context, String lang);

    /* bool IsSimultaneous([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsSimultaneousConst(es2panda_Context context, String lang);

    /* void SetSimultaneous(bool value) */
    [set] void SetSimultaneous(es2panda_Context context, boolean value);

    /* bool WasSetSimultaneous([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetSimultaneousConst(es2panda_Context context, String lang);

    /* bool IsStoreDeclarationCacheDirectlyInMemory([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsStoreDeclarationCacheDirectlyInMemoryConst(es2panda_Context context, String lang);

    /* void SetStoreDeclarationCacheDirectlyInMemory(bool value) */
    [set] void SetStoreDeclarationCacheDirectlyInMemory(es2panda_Context context, boolean value);

    /* bool WasSetStoreDeclarationCacheDirectlyInMemory([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetStoreDeclarationCacheDirectlyInMemoryConst(es2panda_Context context, String lang);

    /* bool IsEtsStringsConcat([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEtsStringsConcatConst(es2panda_Context context, String lang);

    /* void SetEtsStringsConcat(bool value) */
    [set] void SetEtsStringsConcat(es2panda_Context context, boolean value);

    /* bool WasSetEtsStringsConcat([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEtsStringsConcatConst(es2panda_Context context, String lang);

    /* bool IsPermitRelaxedAny([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsPermitRelaxedAnyConst(es2panda_Context context, String lang);

    /* void SetPermitRelaxedAny(bool value) */
    [set] void SetPermitRelaxedAny(es2panda_Context context, boolean value);

    /* bool WasSetPermitRelaxedAny([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetPermitRelaxedAnyConst(es2panda_Context context, String lang);

    /* bool IsEmitMetadata([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean IsEmitMetadataConst(es2panda_Context context, String lang);

    /* void SetEmitMetadata(bool value) */
    [set] void SetEmitMetadata(es2panda_Context context, boolean value);

    /* bool WasSetEmitMetadata([[maybe_unused]] std::string_view lang = "") const */
    [get] boolean WasSetEmitMetadataConst(es2panda_Context context, String lang);
};

};  // namespace gen

namespace es2panda {

[Entity=Class, c_type=es2panda_ArkTsConfig] interface ArkTsConfig {

    /* explicit ArkTsConfig(std::string_view configPath, util::DiagnosticEngine &de) */
    static es2panda.ArkTsConfig Create(es2panda_Context context, String configPath, es2panda_ErrorLogger de);

    /* bool Parse() */
    boolean Parse(es2panda_Context context);

    /* void FixupWithStdlibOption(const std::string &stdlib) */
    void FixupWithStdlibOption(es2panda_Context context, String stdlib);

    /* void ResolveAllDependenciesInArkTsConfig() */
    void ResolveAllDependenciesInArkTsConfig(es2panda_Context context);

    /* const std::string &ConfigPath() const */
    [get] String ConfigPathConst(es2panda_Context context);

    /* const std::string &Package() const */
    [get] String PackageConst(es2panda_Context context);

    /* const std::string &BaseUrl() const */
    [get] String BaseUrlConst(es2panda_Context context);

    /* const std::string &RootDir() const */
    [get] String RootDirConst(es2panda_Context context);

    /* const std::string &OutDir() const */
    [get] String OutDirConst(es2panda_Context context);

    /* const std::string &CacheDir() const */
    [get] String CacheDirConst(es2panda_Context context);

    /* const std::string &DeclgenV2OutPath() const */
    [get] String DeclgenV2OutPathConst(es2panda_Context context);

    /* const std::vector<std::string> &Files() const */
    [get] sequence<String> FilesConst(es2panda_Context context);

    /* const bool &UseUrl() const */
    [get] boolean UseUrlConst(es2panda_Context context);

    /* void GenerateSourcePathMap() */
    void GenerateSourcePathMap(es2panda_Context context);
};

};  // namespace es2panda

namespace ast_verifier {

[Entity=Class, c_type=es2panda_AstVerifier] interface ASTVerifier {

    /* explicit ASTVerifier(const public_lib::Context &context) */
    static es2panda_AstVerifier Create(es2panda_Context context);

    /* void After() */
    void After(es2panda_Context context);

    /* void Before() */
    void Before(es2panda_Context context);

    /* void Verify(std::string_view phaseName) noexcept */
    void Verify(es2panda_Context context, String phaseName);

    /* void IntroduceNewInvariants(std::string_view occurredPhaseName) */
    void IntroduceNewInvariants(es2panda_Context context, String occurredPhaseName);

    /* void Suppress() */
    void Suppress(es2panda_Context context);

    /* void DumpMessages() const */
    void DumpMessagesConst(es2panda_Context context);

    /* bool TreatAsWarning(VerifierInvariants id) const */
    [get] boolean TreatAsWarningConst(es2panda_Context context, Es2pandaEnum id);

    /* bool TreatAsError(VerifierInvariants id) const */
    [get] boolean TreatAsErrorConst(es2panda_Context context, Es2pandaEnum id);

    /* bool HasErrors() const */
    [get] boolean HasErrorsConst(es2panda_Context context);

    /* bool HasWarnings() const */
    [get] boolean HasWarningsConst(es2panda_Context context);
};

};  // namespace ast_verifier
