/* :markup: markdown */

/*----------------------------------------------------------------------------*/
/* This file is generated by the templates/template.rb script and should not  */
/* be modified manually. See                                                  */
/* templates/ext/prism/api_node.c.erb                                         */
/* if you are looking to modify the                                           */
/* template                                                                   */
/*----------------------------------------------------------------------------*/

#line 2 "prism/templates/ext/prism/api_node.c.erb"
#include "prism/extension.h"

extern VALUE rb_cPrism;
extern VALUE rb_cPrismNode;
extern VALUE rb_cPrismSource;
extern VALUE rb_cPrismToken;
extern VALUE rb_cPrismLocation;

static VALUE rb_cPrismAliasGlobalVariableNode;
static VALUE rb_cPrismAliasMethodNode;
static VALUE rb_cPrismAlternationPatternNode;
static VALUE rb_cPrismAndNode;
static VALUE rb_cPrismArgumentsNode;
static VALUE rb_cPrismArrayNode;
static VALUE rb_cPrismArrayPatternNode;
static VALUE rb_cPrismAssocNode;
static VALUE rb_cPrismAssocSplatNode;
static VALUE rb_cPrismBackReferenceReadNode;
static VALUE rb_cPrismBeginNode;
static VALUE rb_cPrismBlockArgumentNode;
static VALUE rb_cPrismBlockLocalVariableNode;
static VALUE rb_cPrismBlockNode;
static VALUE rb_cPrismBlockParameterNode;
static VALUE rb_cPrismBlockParametersNode;
static VALUE rb_cPrismBreakNode;
static VALUE rb_cPrismCallAndWriteNode;
static VALUE rb_cPrismCallNode;
static VALUE rb_cPrismCallOperatorWriteNode;
static VALUE rb_cPrismCallOrWriteNode;
static VALUE rb_cPrismCallTargetNode;
static VALUE rb_cPrismCapturePatternNode;
static VALUE rb_cPrismCaseMatchNode;
static VALUE rb_cPrismCaseNode;
static VALUE rb_cPrismClassNode;
static VALUE rb_cPrismClassVariableAndWriteNode;
static VALUE rb_cPrismClassVariableOperatorWriteNode;
static VALUE rb_cPrismClassVariableOrWriteNode;
static VALUE rb_cPrismClassVariableReadNode;
static VALUE rb_cPrismClassVariableTargetNode;
static VALUE rb_cPrismClassVariableWriteNode;
static VALUE rb_cPrismConstantAndWriteNode;
static VALUE rb_cPrismConstantOperatorWriteNode;
static VALUE rb_cPrismConstantOrWriteNode;
static VALUE rb_cPrismConstantPathAndWriteNode;
static VALUE rb_cPrismConstantPathNode;
static VALUE rb_cPrismConstantPathOperatorWriteNode;
static VALUE rb_cPrismConstantPathOrWriteNode;
static VALUE rb_cPrismConstantPathTargetNode;
static VALUE rb_cPrismConstantPathWriteNode;
static VALUE rb_cPrismConstantReadNode;
static VALUE rb_cPrismConstantTargetNode;
static VALUE rb_cPrismConstantWriteNode;
static VALUE rb_cPrismDefNode;
static VALUE rb_cPrismDefinedNode;
static VALUE rb_cPrismElseNode;
static VALUE rb_cPrismEmbeddedStatementsNode;
static VALUE rb_cPrismEmbeddedVariableNode;
static VALUE rb_cPrismEnsureNode;
static VALUE rb_cPrismFalseNode;
static VALUE rb_cPrismFindPatternNode;
static VALUE rb_cPrismFlipFlopNode;
static VALUE rb_cPrismFloatNode;
static VALUE rb_cPrismForNode;
static VALUE rb_cPrismForwardingArgumentsNode;
static VALUE rb_cPrismForwardingParameterNode;
static VALUE rb_cPrismForwardingSuperNode;
static VALUE rb_cPrismGlobalVariableAndWriteNode;
static VALUE rb_cPrismGlobalVariableOperatorWriteNode;
static VALUE rb_cPrismGlobalVariableOrWriteNode;
static VALUE rb_cPrismGlobalVariableReadNode;
static VALUE rb_cPrismGlobalVariableTargetNode;
static VALUE rb_cPrismGlobalVariableWriteNode;
static VALUE rb_cPrismHashNode;
static VALUE rb_cPrismHashPatternNode;
static VALUE rb_cPrismIfNode;
static VALUE rb_cPrismImaginaryNode;
static VALUE rb_cPrismImplicitNode;
static VALUE rb_cPrismImplicitRestNode;
static VALUE rb_cPrismInNode;
static VALUE rb_cPrismIndexAndWriteNode;
static VALUE rb_cPrismIndexOperatorWriteNode;
static VALUE rb_cPrismIndexOrWriteNode;
static VALUE rb_cPrismIndexTargetNode;
static VALUE rb_cPrismInstanceVariableAndWriteNode;
static VALUE rb_cPrismInstanceVariableOperatorWriteNode;
static VALUE rb_cPrismInstanceVariableOrWriteNode;
static VALUE rb_cPrismInstanceVariableReadNode;
static VALUE rb_cPrismInstanceVariableTargetNode;
static VALUE rb_cPrismInstanceVariableWriteNode;
static VALUE rb_cPrismIntegerNode;
static VALUE rb_cPrismInterpolatedMatchLastLineNode;
static VALUE rb_cPrismInterpolatedRegularExpressionNode;
static VALUE rb_cPrismInterpolatedStringNode;
static VALUE rb_cPrismInterpolatedSymbolNode;
static VALUE rb_cPrismInterpolatedXStringNode;
static VALUE rb_cPrismItLocalVariableReadNode;
static VALUE rb_cPrismItParametersNode;
static VALUE rb_cPrismKeywordHashNode;
static VALUE rb_cPrismKeywordRestParameterNode;
static VALUE rb_cPrismLambdaNode;
static VALUE rb_cPrismLocalVariableAndWriteNode;
static VALUE rb_cPrismLocalVariableOperatorWriteNode;
static VALUE rb_cPrismLocalVariableOrWriteNode;
static VALUE rb_cPrismLocalVariableReadNode;
static VALUE rb_cPrismLocalVariableTargetNode;
static VALUE rb_cPrismLocalVariableWriteNode;
static VALUE rb_cPrismMatchLastLineNode;
static VALUE rb_cPrismMatchPredicateNode;
static VALUE rb_cPrismMatchRequiredNode;
static VALUE rb_cPrismMatchWriteNode;
static VALUE rb_cPrismMissingNode;
static VALUE rb_cPrismModuleNode;
static VALUE rb_cPrismMultiTargetNode;
static VALUE rb_cPrismMultiWriteNode;
static VALUE rb_cPrismNextNode;
static VALUE rb_cPrismNilNode;
static VALUE rb_cPrismNoKeywordsParameterNode;
static VALUE rb_cPrismNumberedParametersNode;
static VALUE rb_cPrismNumberedReferenceReadNode;
static VALUE rb_cPrismOptionalKeywordParameterNode;
static VALUE rb_cPrismOptionalParameterNode;
static VALUE rb_cPrismOrNode;
static VALUE rb_cPrismParametersNode;
static VALUE rb_cPrismParenthesesNode;
static VALUE rb_cPrismPinnedExpressionNode;
static VALUE rb_cPrismPinnedVariableNode;
static VALUE rb_cPrismPostExecutionNode;
static VALUE rb_cPrismPreExecutionNode;
static VALUE rb_cPrismProgramNode;
static VALUE rb_cPrismRangeNode;
static VALUE rb_cPrismRationalNode;
static VALUE rb_cPrismRedoNode;
static VALUE rb_cPrismRegularExpressionNode;
static VALUE rb_cPrismRequiredKeywordParameterNode;
static VALUE rb_cPrismRequiredParameterNode;
static VALUE rb_cPrismRescueModifierNode;
static VALUE rb_cPrismRescueNode;
static VALUE rb_cPrismRestParameterNode;
static VALUE rb_cPrismRetryNode;
static VALUE rb_cPrismReturnNode;
static VALUE rb_cPrismSelfNode;
static VALUE rb_cPrismShareableConstantNode;
static VALUE rb_cPrismSingletonClassNode;
static VALUE rb_cPrismSourceEncodingNode;
static VALUE rb_cPrismSourceFileNode;
static VALUE rb_cPrismSourceLineNode;
static VALUE rb_cPrismSplatNode;
static VALUE rb_cPrismStatementsNode;
static VALUE rb_cPrismStringNode;
static VALUE rb_cPrismSuperNode;
static VALUE rb_cPrismSymbolNode;
static VALUE rb_cPrismTrueNode;
static VALUE rb_cPrismUndefNode;
static VALUE rb_cPrismUnlessNode;
static VALUE rb_cPrismUntilNode;
static VALUE rb_cPrismWhenNode;
static VALUE rb_cPrismWhileNode;
static VALUE rb_cPrismXStringNode;
static VALUE rb_cPrismYieldNode;

static VALUE
pm_location_new(const pm_parser_t *parser, const uint8_t *start, const uint8_t *end, VALUE source, bool freeze) {
    if (freeze) {
        VALUE location_argv[] = {
            source,
            LONG2FIX(start - parser->start),
            LONG2FIX(end - start)
        };

        return rb_obj_freeze(rb_class_new_instance(3, location_argv, rb_cPrismLocation));
    } else {
        uint64_t value = ((((uint64_t) (start - parser->start)) << 32) | ((uint32_t) (end - start)));
        return ULL2NUM(value);
    }
}

VALUE
pm_token_new(const pm_parser_t *parser, const pm_token_t *token, rb_encoding *encoding, VALUE source, bool freeze) {
    ID type = rb_intern(pm_token_type_name(token->type));
    VALUE location = pm_location_new(parser, token->start, token->end, source, freeze);

    VALUE slice = rb_enc_str_new((const char *) token->start, token->end - token->start, encoding);
    if (freeze) rb_obj_freeze(slice);

    VALUE argv[] = { source, ID2SYM(type), slice, location };
    VALUE value = rb_class_new_instance(4, argv, rb_cPrismToken);
    if (freeze) rb_obj_freeze(value);

    return value;
}

static VALUE
pm_string_new(const pm_string_t *string, rb_encoding *encoding) {
    return rb_obj_freeze(rb_enc_str_new((const char *) pm_string_source(string), pm_string_length(string), encoding));
}

VALUE
pm_integer_new(const pm_integer_t *integer) {
    VALUE result;
    if (integer->values == NULL) {
        result = UINT2NUM(integer->value);
    } else {
        VALUE string = rb_str_new(NULL, integer->length * 8);
        unsigned char *bytes = (unsigned char *) RSTRING_PTR(string);

        size_t offset = integer->length * 8;
        for (size_t value_index = 0; value_index < integer->length; value_index++) {
            uint32_t value = integer->values[value_index];

            for (int index = 0; index < 8; index++) {
                int byte = (value >> (4 * index)) & 0xf;
                bytes[--offset] = byte < 10 ? byte + '0' : byte - 10 + 'a';
            }
        }

        result = rb_funcall(string, rb_intern("to_i"), 1, UINT2NUM(16));
    }

    if (integer->negative) {
        result = rb_funcall(result, rb_intern("-@"), 0);
    }

    return result;
}

// Create a Prism::Source object from the given parser, after pm_parse() was called.
VALUE
pm_source_new(const pm_parser_t *parser, rb_encoding *encoding, bool freeze) {
    VALUE source_string = rb_enc_str_new((const char *) parser->start, parser->end - parser->start, encoding);

    VALUE offsets = rb_ary_new_capa(parser->newline_list.size);
    for (size_t index = 0; index < parser->newline_list.size; index++) {
        rb_ary_push(offsets, ULONG2NUM(parser->newline_list.offsets[index]));
    }

    if (freeze) {
        rb_obj_freeze(source_string);
        rb_obj_freeze(offsets);
    }

    VALUE source = rb_funcall(rb_cPrismSource, rb_intern("for"), 3, source_string, LONG2NUM(parser->start_line), offsets);
    if (freeze) rb_obj_freeze(source);

    return source;
}

typedef struct pm_node_stack_node {
    struct pm_node_stack_node *prev;
    const pm_node_t *visit;
    bool visited;
} pm_node_stack_node_t;

static void
pm_node_stack_push(pm_node_stack_node_t **stack, const pm_node_t *visit) {
    pm_node_stack_node_t *node = xmalloc(sizeof(pm_node_stack_node_t));
    node->prev = *stack;
    node->visit = visit;
    node->visited = false;
    *stack = node;
}

static const pm_node_t *
pm_node_stack_pop(pm_node_stack_node_t **stack) {
    pm_node_stack_node_t *current = *stack;
    const pm_node_t *visit = current->visit;

    *stack = current->prev;
    xfree(current);

    return visit;
}

VALUE
pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encoding, VALUE source, bool freeze) {
    VALUE constants = rb_ary_new_capa(parser->constant_pool.size);

    for (uint32_t index = 0; index < parser->constant_pool.size; index++) {
        pm_constant_t *constant = &parser->constant_pool.constants[index];
        int state = 0;

        VALUE string = rb_enc_str_new((const char *) constant->start, constant->length, encoding);
        VALUE value = rb_protect(rb_str_intern, string, &state);

        if (state != 0) {
            value = ID2SYM(rb_intern_const("?"));
            rb_set_errinfo(Qnil);
        }

        rb_ary_push(constants, value);
    }

    pm_node_stack_node_t *node_stack = NULL;
    pm_node_stack_push(&node_stack, node);
    VALUE value_stack = rb_ary_new();

    while (node_stack != NULL) {
        if (!node_stack->visited) {
            if (node_stack->visit == NULL) {
                pm_node_stack_pop(&node_stack);
                rb_ary_push(value_stack, Qnil);
                continue;
            }

            const pm_node_t *node = node_stack->visit;
            node_stack->visited = true;

            switch (PM_NODE_TYPE(node)) {
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
                    pm_alias_global_variable_node_t *cast = (pm_alias_global_variable_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->new_name);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->old_name);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALIAS_METHOD_NODE: {
                    pm_alias_method_node_t *cast = (pm_alias_method_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->new_name);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->old_name);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALTERNATION_PATTERN_NODE: {
                    pm_alternation_pattern_node_t *cast = (pm_alternation_pattern_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_AND_NODE: {
                    pm_and_node_t *cast = (pm_and_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARGUMENTS_NODE: {
                    pm_arguments_node_t *cast = (pm_arguments_node_t *) node;
                    for (size_t index = 0; index < cast->arguments.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARRAY_NODE: {
                    pm_array_node_t *cast = (pm_array_node_t *) node;
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->elements.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARRAY_PATTERN_NODE: {
                    pm_array_pattern_node_t *cast = (pm_array_pattern_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->constant);
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->requireds.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rest);
                    for (size_t index = 0; index < cast->posts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->posts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ASSOC_NODE: {
                    pm_assoc_node_t *cast = (pm_assoc_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->key);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ASSOC_SPLAT_NODE: {
                    pm_assoc_splat_node_t *cast = (pm_assoc_splat_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BEGIN_NODE: {
                    pm_begin_node_t *cast = (pm_begin_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rescue_clause);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->else_clause);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->ensure_clause);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_ARGUMENT_NODE: {
                    pm_block_argument_node_t *cast = (pm_block_argument_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->expression);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_NODE: {
                    pm_block_node_t *cast = (pm_block_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parameters);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_PARAMETERS_NODE: {
                    pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parameters);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->locals.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BREAK_NODE: {
                    pm_break_node_t *cast = (pm_break_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_AND_WRITE_NODE: {
                    pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_NODE: {
                    pm_call_node_t *cast = (pm_call_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_OPERATOR_WRITE_NODE: {
                    pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_OR_WRITE_NODE: {
                    pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_TARGET_NODE: {
                    pm_call_target_node_t *cast = (pm_call_target_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CAPTURE_PATTERN_NODE: {
                    pm_capture_pattern_node_t *cast = (pm_capture_pattern_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->target);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CASE_MATCH_NODE: {
                    pm_case_match_node_t *cast = (pm_case_match_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->conditions.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->else_clause);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CASE_NODE: {
                    pm_case_node_t *cast = (pm_case_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->conditions.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->else_clause);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_NODE: {
                    pm_class_node_t *cast = (pm_class_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->constant_path);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->superclass);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
                    pm_class_variable_and_write_node_t *cast = (pm_class_variable_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_class_variable_operator_write_node_t *cast = (pm_class_variable_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
                    pm_class_variable_or_write_node_t *cast = (pm_class_variable_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_WRITE_NODE: {
                    pm_class_variable_write_node_t *cast = (pm_class_variable_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_AND_WRITE_NODE: {
                    pm_constant_and_write_node_t *cast = (pm_constant_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_OPERATOR_WRITE_NODE: {
                    pm_constant_operator_write_node_t *cast = (pm_constant_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_OR_WRITE_NODE: {
                    pm_constant_or_write_node_t *cast = (pm_constant_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_AND_WRITE_NODE: {
                    pm_constant_path_and_write_node_t *cast = (pm_constant_path_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->target);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_NODE: {
                    pm_constant_path_node_t *cast = (pm_constant_path_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parent);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
                    pm_constant_path_operator_write_node_t *cast = (pm_constant_path_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->target);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_OR_WRITE_NODE: {
                    pm_constant_path_or_write_node_t *cast = (pm_constant_path_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->target);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_TARGET_NODE: {
                    pm_constant_path_target_node_t *cast = (pm_constant_path_target_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parent);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_WRITE_NODE: {
                    pm_constant_path_write_node_t *cast = (pm_constant_path_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->target);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_WRITE_NODE: {
                    pm_constant_write_node_t *cast = (pm_constant_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_DEF_NODE: {
                    pm_def_node_t *cast = (pm_def_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parameters);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_DEFINED_NODE: {
                    pm_defined_node_t *cast = (pm_defined_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ELSE_NODE: {
                    pm_else_node_t *cast = (pm_else_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_EMBEDDED_STATEMENTS_NODE: {
                    pm_embedded_statements_node_t *cast = (pm_embedded_statements_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_EMBEDDED_VARIABLE_NODE: {
                    pm_embedded_variable_node_t *cast = (pm_embedded_variable_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->variable);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ENSURE_NODE: {
                    pm_ensure_node_t *cast = (pm_ensure_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FIND_PATTERN_NODE: {
                    pm_find_pattern_node_t *cast = (pm_find_pattern_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->constant);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->requireds.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FLIP_FLOP_NODE: {
                    pm_flip_flop_node_t *cast = (pm_flip_flop_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FOR_NODE: {
                    pm_for_node_t *cast = (pm_for_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->index);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->collection);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FORWARDING_SUPER_NODE: {
                    pm_forwarding_super_node_t *cast = (pm_forwarding_super_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
                    pm_global_variable_and_write_node_t *cast = (pm_global_variable_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_global_variable_operator_write_node_t *cast = (pm_global_variable_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
                    pm_global_variable_or_write_node_t *cast = (pm_global_variable_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_WRITE_NODE: {
                    pm_global_variable_write_node_t *cast = (pm_global_variable_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_HASH_NODE: {
                    pm_hash_node_t *cast = (pm_hash_node_t *) node;
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->elements.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_HASH_PATTERN_NODE: {
                    pm_hash_pattern_node_t *cast = (pm_hash_pattern_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->constant);
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->elements.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rest);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IF_NODE: {
                    pm_if_node_t *cast = (pm_if_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->subsequent);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IMAGINARY_NODE: {
                    pm_imaginary_node_t *cast = (pm_imaginary_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->numeric);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IMPLICIT_NODE: {
                    pm_implicit_node_t *cast = (pm_implicit_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IN_NODE: {
                    pm_in_node_t *cast = (pm_in_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->pattern);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_AND_WRITE_NODE: {
                    pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_OPERATOR_WRITE_NODE: {
                    pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_OR_WRITE_NODE: {
                    pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_TARGET_NODE: {
                    pm_index_target_node_t *cast = (pm_index_target_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->receiver);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
                    pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_instance_variable_operator_write_node_t *cast = (pm_instance_variable_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
                    pm_instance_variable_or_write_node_t *cast = (pm_instance_variable_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_WRITE_NODE: {
                    pm_instance_variable_write_node_t *cast = (pm_instance_variable_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
                    pm_interpolated_match_last_line_node_t *cast = (pm_interpolated_match_last_line_node_t *) node;
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->parts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
                    pm_interpolated_regular_expression_node_t *cast = (pm_interpolated_regular_expression_node_t *) node;
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->parts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_STRING_NODE: {
                    pm_interpolated_string_node_t *cast = (pm_interpolated_string_node_t *) node;
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->parts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_SYMBOL_NODE: {
                    pm_interpolated_symbol_node_t *cast = (pm_interpolated_symbol_node_t *) node;
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->parts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_X_STRING_NODE: {
                    pm_interpolated_x_string_node_t *cast = (pm_interpolated_x_string_node_t *) node;
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->parts.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_KEYWORD_HASH_NODE: {
                    pm_keyword_hash_node_t *cast = (pm_keyword_hash_node_t *) node;
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->elements.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LAMBDA_NODE: {
                    pm_lambda_node_t *cast = (pm_lambda_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->parameters);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
                    pm_local_variable_and_write_node_t *cast = (pm_local_variable_and_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_local_variable_operator_write_node_t *cast = (pm_local_variable_operator_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
                    pm_local_variable_or_write_node_t *cast = (pm_local_variable_or_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_WRITE_NODE: {
                    pm_local_variable_write_node_t *cast = (pm_local_variable_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_PREDICATE_NODE: {
                    pm_match_predicate_node_t *cast = (pm_match_predicate_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->pattern);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_REQUIRED_NODE: {
                    pm_match_required_node_t *cast = (pm_match_required_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->pattern);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_WRITE_NODE: {
                    pm_match_write_node_t *cast = (pm_match_write_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->call);
                    for (size_t index = 0; index < cast->targets.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->targets.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MODULE_NODE: {
                    pm_module_node_t *cast = (pm_module_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->constant_path);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MULTI_TARGET_NODE: {
                    pm_multi_target_node_t *cast = (pm_multi_target_node_t *) node;
                    for (size_t index = 0; index < cast->lefts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->lefts.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rest);
                    for (size_t index = 0; index < cast->rights.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->rights.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MULTI_WRITE_NODE: {
                    pm_multi_write_node_t *cast = (pm_multi_write_node_t *) node;
                    for (size_t index = 0; index < cast->lefts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->lefts.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rest);
                    for (size_t index = 0; index < cast->rights.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->rights.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NEXT_NODE: {
                    pm_next_node_t *cast = (pm_next_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
                    pm_optional_keyword_parameter_node_t *cast = (pm_optional_keyword_parameter_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OPTIONAL_PARAMETER_NODE: {
                    pm_optional_parameter_node_t *cast = (pm_optional_parameter_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->value);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OR_NODE: {
                    pm_or_node_t *cast = (pm_or_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PARAMETERS_NODE: {
                    pm_parameters_node_t *cast = (pm_parameters_node_t *) node;
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->requireds.nodes[index]);
                    }
                    for (size_t index = 0; index < cast->optionals.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->optionals.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rest);
                    for (size_t index = 0; index < cast->posts.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->posts.nodes[index]);
                    }
                    for (size_t index = 0; index < cast->keywords.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->keywords.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->keyword_rest);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PARENTHESES_NODE: {
                    pm_parentheses_node_t *cast = (pm_parentheses_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PINNED_EXPRESSION_NODE: {
                    pm_pinned_expression_node_t *cast = (pm_pinned_expression_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->expression);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PINNED_VARIABLE_NODE: {
                    pm_pinned_variable_node_t *cast = (pm_pinned_variable_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->variable);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_POST_EXECUTION_NODE: {
                    pm_post_execution_node_t *cast = (pm_post_execution_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PRE_EXECUTION_NODE: {
                    pm_pre_execution_node_t *cast = (pm_pre_execution_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PROGRAM_NODE: {
                    pm_program_node_t *cast = (pm_program_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RANGE_NODE: {
                    pm_range_node_t *cast = (pm_range_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->left);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RESCUE_MODIFIER_NODE: {
                    pm_rescue_modifier_node_t *cast = (pm_rescue_modifier_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->expression);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->rescue_expression);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RESCUE_NODE: {
                    pm_rescue_node_t *cast = (pm_rescue_node_t *) node;
                    for (size_t index = 0; index < cast->exceptions.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->exceptions.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->reference);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->subsequent);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RETURN_NODE: {
                    pm_return_node_t *cast = (pm_return_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SHAREABLE_CONSTANT_NODE: {
                    pm_shareable_constant_node_t *cast = (pm_shareable_constant_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->write);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SINGLETON_CLASS_NODE: {
                    pm_singleton_class_node_t *cast = (pm_singleton_class_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->expression);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->body);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SPLAT_NODE: {
                    pm_splat_node_t *cast = (pm_splat_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->expression);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_STATEMENTS_NODE: {
                    pm_statements_node_t *cast = (pm_statements_node_t *) node;
                    for (size_t index = 0; index < cast->body.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->body.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SUPER_NODE: {
                    pm_super_node_t *cast = (pm_super_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->block);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNDEF_NODE: {
                    pm_undef_node_t *cast = (pm_undef_node_t *) node;
                    for (size_t index = 0; index < cast->names.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->names.nodes[index]);
                    }
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNLESS_NODE: {
                    pm_unless_node_t *cast = (pm_unless_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->else_clause);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNTIL_NODE: {
                    pm_until_node_t *cast = (pm_until_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_WHEN_NODE: {
                    pm_when_node_t *cast = (pm_when_node_t *) node;
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        pm_node_stack_push(&node_stack, (pm_node_t *) cast->conditions.nodes[index]);
                    }
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_WHILE_NODE: {
                    pm_while_node_t *cast = (pm_while_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->predicate);
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->statements);
                    break;
                }
#line 164 "prism/templates/ext/prism/api_node.c.erb"
                case PM_YIELD_NODE: {
                    pm_yield_node_t *cast = (pm_yield_node_t *) node;
                    pm_node_stack_push(&node_stack, (pm_node_t *) cast->arguments);
                    break;
                }
                default:
                    break;
            }
#line 184 "prism/templates/ext/prism/api_node.c.erb"
        } else {
            const pm_node_t *node = pm_node_stack_pop(&node_stack);

            switch (PM_NODE_TYPE(node)) {
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
                    pm_alias_global_variable_node_t *cast = (pm_alias_global_variable_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // new_name
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // old_name
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismAliasGlobalVariableNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALIAS_METHOD_NODE: {
                    pm_alias_method_node_t *cast = (pm_alias_method_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // new_name
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // old_name
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismAliasMethodNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ALTERNATION_PATTERN_NODE: {
                    pm_alternation_pattern_node_t *cast = (pm_alternation_pattern_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismAlternationPatternNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_AND_NODE: {
                    pm_and_node_t *cast = (pm_and_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismAndNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARGUMENTS_NODE: {
                    pm_arguments_node_t *cast = (pm_arguments_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // arguments
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->arguments.size);
                    for (size_t index = 0; index < cast->arguments.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismArgumentsNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARRAY_NODE: {
                    pm_array_node_t *cast = (pm_array_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // elements
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->elements.size);
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismArrayNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ARRAY_PATTERN_NODE: {
                    pm_array_pattern_node_t *cast = (pm_array_pattern_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // constant
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // requireds
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->requireds.size);
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // posts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_new_capa(cast->posts.size);
                    for (size_t index = 0; index < cast->posts.size; index++) {
                        rb_ary_push(argv[7], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[7]);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismArrayPatternNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ASSOC_NODE: {
                    pm_assoc_node_t *cast = (pm_assoc_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // key
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismAssocNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ASSOC_SPLAT_NODE: {
                    pm_assoc_splat_node_t *cast = (pm_assoc_splat_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismAssocSplatNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BACK_REFERENCE_READ_NODE: {
                    pm_back_reference_read_node_t *cast = (pm_back_reference_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismBackReferenceReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BEGIN_NODE: {
                    pm_begin_node_t *cast = (pm_begin_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // begin_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->begin_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->begin_keyword_loc.start, cast->begin_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // rescue_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // else_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // ensure_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->end_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismBeginNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_ARGUMENT_NODE: {
                    pm_block_argument_node_t *cast = (pm_block_argument_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismBlockArgumentNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_LOCAL_VARIABLE_NODE: {
                    pm_block_local_variable_node_t *cast = (pm_block_local_variable_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismBlockLocalVariableNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_NODE: {
                    pm_block_node_t *cast = (pm_block_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // parameters
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismBlockNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_PARAMETER_NODE: {
                    pm_block_parameter_node_t *cast = (pm_block_parameter_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
                    argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->name_loc.start == NULL ? Qnil : pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismBlockParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BLOCK_PARAMETERS_NODE: {
                    pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // parameters
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // locals
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismBlockParametersNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_BREAK_NODE: {
                    pm_break_node_t *cast = (pm_break_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismBreakNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_AND_WRITE_NODE: {
                    pm_call_and_write_node_t *cast = (pm_call_and_write_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // message_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source, freeze);

                    // read_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->read_name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->read_name - 1);

                    // write_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->write_name != 0);
                    argv[8] = RARRAY_AREF(constants, cast->write_name - 1);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismCallAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_NODE: {
                    pm_call_node_t *cast = (pm_call_node_t *) node;
                    VALUE argv[13];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[6] = RARRAY_AREF(constants, cast->name - 1);

                    // message_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source, freeze);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // equal_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = cast->equal_loc.start == NULL ? Qnil : pm_location_new(parser, cast->equal_loc.start, cast->equal_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[12] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(13, argv, rb_cPrismCallNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_OPERATOR_WRITE_NODE: {
                    pm_call_operator_write_node_t *cast = (pm_call_operator_write_node_t *) node;
                    VALUE argv[12];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // message_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source, freeze);

                    // read_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->read_name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->read_name - 1);

                    // write_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->write_name != 0);
                    argv[8] = RARRAY_AREF(constants, cast->write_name - 1);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[9] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(12, argv, rb_cPrismCallOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_OR_WRITE_NODE: {
                    pm_call_or_write_node_t *cast = (pm_call_or_write_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // message_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->message_loc.start == NULL ? Qnil : pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source, freeze);

                    // read_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->read_name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->read_name - 1);

                    // write_name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->write_name != 0);
                    argv[8] = RARRAY_AREF(constants, cast->write_name - 1);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismCallOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CALL_TARGET_NODE: {
                    pm_call_target_node_t *cast = (pm_call_target_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[6] = RARRAY_AREF(constants, cast->name - 1);

                    // message_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->message_loc.start, cast->message_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismCallTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CAPTURE_PATTERN_NODE: {
                    pm_capture_pattern_node_t *cast = (pm_capture_pattern_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // target
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismCapturePatternNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CASE_MATCH_NODE: {
                    pm_case_match_node_t *cast = (pm_case_match_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // conditions
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->conditions.size);
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // else_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // case_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->case_keyword_loc.start, cast->case_keyword_loc.end, source, freeze);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismCaseMatchNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CASE_NODE: {
                    pm_case_node_t *cast = (pm_case_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // conditions
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->conditions.size);
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // else_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // case_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->case_keyword_loc.start, cast->case_keyword_loc.end, source, freeze);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismCaseNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_NODE: {
                    pm_class_node_t *cast = (pm_class_node_t *) node;
                    VALUE argv[12];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // class_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->class_keyword_loc.start, cast->class_keyword_loc.end, source, freeze);

                    // constant_path
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // inheritance_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->inheritance_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->inheritance_operator_loc.start, cast->inheritance_operator_loc.end, source, freeze);

                    // superclass
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[11] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(12, argv, rb_cPrismClassNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
                    pm_class_variable_and_write_node_t *cast = (pm_class_variable_and_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismClassVariableAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_class_variable_operator_write_node_t *cast = (pm_class_variable_operator_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismClassVariableOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
                    pm_class_variable_or_write_node_t *cast = (pm_class_variable_or_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismClassVariableOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_READ_NODE: {
                    pm_class_variable_read_node_t *cast = (pm_class_variable_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismClassVariableReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_TARGET_NODE: {
                    pm_class_variable_target_node_t *cast = (pm_class_variable_target_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismClassVariableTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CLASS_VARIABLE_WRITE_NODE: {
                    pm_class_variable_write_node_t *cast = (pm_class_variable_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismClassVariableWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_AND_WRITE_NODE: {
                    pm_constant_and_write_node_t *cast = (pm_constant_and_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_OPERATOR_WRITE_NODE: {
                    pm_constant_operator_write_node_t *cast = (pm_constant_operator_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismConstantOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_OR_WRITE_NODE: {
                    pm_constant_or_write_node_t *cast = (pm_constant_or_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_AND_WRITE_NODE: {
                    pm_constant_path_and_write_node_t *cast = (pm_constant_path_and_write_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // target
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismConstantPathAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_NODE: {
                    pm_constant_path_node_t *cast = (pm_constant_path_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // parent
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // name
                    argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);

                    // delimiter_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->delimiter_loc.start, cast->delimiter_loc.end, source, freeze);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantPathNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
                    pm_constant_path_operator_write_node_t *cast = (pm_constant_path_operator_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // target
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[7] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantPathOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_OR_WRITE_NODE: {
                    pm_constant_path_or_write_node_t *cast = (pm_constant_path_or_write_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // target
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismConstantPathOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_TARGET_NODE: {
                    pm_constant_path_target_node_t *cast = (pm_constant_path_target_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // parent
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // name
                    argv[5] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);

                    // delimiter_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->delimiter_loc.start, cast->delimiter_loc.end, source, freeze);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantPathTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_PATH_WRITE_NODE: {
                    pm_constant_path_write_node_t *cast = (pm_constant_path_write_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // target
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismConstantPathWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_READ_NODE: {
                    pm_constant_read_node_t *cast = (pm_constant_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismConstantReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_TARGET_NODE: {
                    pm_constant_target_node_t *cast = (pm_constant_target_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismConstantTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_CONSTANT_WRITE_NODE: {
                    pm_constant_write_node_t *cast = (pm_constant_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismConstantWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_DEF_NODE: {
                    pm_def_node_t *cast = (pm_def_node_t *) node;
                    VALUE argv[16];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // parameters
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[9], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[9]);

                    // def_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->def_keyword_loc.start, cast->def_keyword_loc.end, source, freeze);

                    // operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = cast->operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[12] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[13] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    // equal_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[14] = cast->equal_loc.start == NULL ? Qnil : pm_location_new(parser, cast->equal_loc.start, cast->equal_loc.end, source, freeze);

                    // end_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[15] = cast->end_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(16, argv, rb_cPrismDefNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_DEFINED_NODE: {
                    pm_defined_node_t *cast = (pm_defined_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismDefinedNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ELSE_NODE: {
                    pm_else_node_t *cast = (pm_else_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // else_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->else_keyword_loc.start, cast->else_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->end_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismElseNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_EMBEDDED_STATEMENTS_NODE: {
                    pm_embedded_statements_node_t *cast = (pm_embedded_statements_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismEmbeddedStatementsNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_EMBEDDED_VARIABLE_NODE: {
                    pm_embedded_variable_node_t *cast = (pm_embedded_variable_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // variable
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismEmbeddedVariableNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_ENSURE_NODE: {
                    pm_ensure_node_t *cast = (pm_ensure_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // ensure_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->ensure_keyword_loc.start, cast->ensure_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismEnsureNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FALSE_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismFalseNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FIND_PATTERN_NODE: {
                    pm_find_pattern_node_t *cast = (pm_find_pattern_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // constant
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // requireds
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_new_capa(cast->requireds.size);
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        rb_ary_push(argv[6], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[6]);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismFindPatternNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FLIP_FLOP_NODE: {
                    pm_flip_flop_node_t *cast = (pm_flip_flop_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismFlipFlopNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FLOAT_NODE: {
                    pm_float_node_t *cast = (pm_float_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 255 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = DBL2NUM(cast->value);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismFloatNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FOR_NODE: {
                    pm_for_node_t *cast = (pm_for_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // index
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // collection
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // for_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->for_keyword_loc.start, cast->for_keyword_loc.end, source, freeze);

                    // in_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->in_keyword_loc.start, cast->in_keyword_loc.end, source, freeze);

                    // do_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->do_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->do_keyword_loc.start, cast->do_keyword_loc.end, source, freeze);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismForNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FORWARDING_ARGUMENTS_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismForwardingArgumentsNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FORWARDING_PARAMETER_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismForwardingParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_FORWARDING_SUPER_NODE: {
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismForwardingSuperNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
                    pm_global_variable_and_write_node_t *cast = (pm_global_variable_and_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismGlobalVariableAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_global_variable_operator_write_node_t *cast = (pm_global_variable_operator_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismGlobalVariableOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
                    pm_global_variable_or_write_node_t *cast = (pm_global_variable_or_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismGlobalVariableOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_READ_NODE: {
                    pm_global_variable_read_node_t *cast = (pm_global_variable_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismGlobalVariableReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_TARGET_NODE: {
                    pm_global_variable_target_node_t *cast = (pm_global_variable_target_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismGlobalVariableTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_GLOBAL_VARIABLE_WRITE_NODE: {
                    pm_global_variable_write_node_t *cast = (pm_global_variable_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismGlobalVariableWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_HASH_NODE: {
                    pm_hash_node_t *cast = (pm_hash_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // elements
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->elements.size);
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismHashNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_HASH_PATTERN_NODE: {
                    pm_hash_pattern_node_t *cast = (pm_hash_pattern_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // constant
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // elements
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->elements.size);
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismHashPatternNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IF_NODE: {
                    pm_if_node_t *cast = (pm_if_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // if_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->if_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->if_keyword_loc.start, cast->if_keyword_loc.end, source, freeze);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // then_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->then_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->then_keyword_loc.start, cast->then_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // subsequent
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->end_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismIfNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IMAGINARY_NODE: {
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // numeric
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismImaginaryNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IMPLICIT_NODE: {
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismImplicitNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IMPLICIT_REST_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismImplicitRestNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IN_NODE: {
                    pm_in_node_t *cast = (pm_in_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // pattern
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // in_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->in_loc.start, cast->in_loc.end, source, freeze);

                    // then_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->then_loc.start == NULL ? Qnil : pm_location_new(parser, cast->then_loc.start, cast->then_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismInNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_AND_WRITE_NODE: {
                    pm_index_and_write_node_t *cast = (pm_index_and_write_node_t *) node;
                    VALUE argv[12];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(12, argv, rb_cPrismIndexAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_OPERATOR_WRITE_NODE: {
                    pm_index_operator_write_node_t *cast = (pm_index_operator_write_node_t *) node;
                    VALUE argv[13];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[10] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[12] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(13, argv, rb_cPrismIndexOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_OR_WRITE_NODE: {
                    pm_index_or_write_node_t *cast = (pm_index_or_write_node_t *) node;
                    VALUE argv[12];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // call_operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->call_operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->call_operator_loc.start, cast->call_operator_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[11] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(12, argv, rb_cPrismIndexOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INDEX_TARGET_NODE: {
                    pm_index_target_node_t *cast = (pm_index_target_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // receiver
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismIndexTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
                    pm_instance_variable_and_write_node_t *cast = (pm_instance_variable_and_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismInstanceVariableAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_instance_variable_operator_write_node_t *cast = (pm_instance_variable_operator_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismInstanceVariableOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
                    pm_instance_variable_or_write_node_t *cast = (pm_instance_variable_or_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismInstanceVariableOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_READ_NODE: {
                    pm_instance_variable_read_node_t *cast = (pm_instance_variable_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismInstanceVariableReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_TARGET_NODE: {
                    pm_instance_variable_target_node_t *cast = (pm_instance_variable_target_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismInstanceVariableTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INSTANCE_VARIABLE_WRITE_NODE: {
                    pm_instance_variable_write_node_t *cast = (pm_instance_variable_write_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismInstanceVariableWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTEGER_NODE: {
                    pm_integer_node_t *cast = (pm_integer_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 252 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_integer_new(&cast->value);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismIntegerNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
                    pm_interpolated_match_last_line_node_t *cast = (pm_interpolated_match_last_line_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // parts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->parts.size);
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismInterpolatedMatchLastLineNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
                    pm_interpolated_regular_expression_node_t *cast = (pm_interpolated_regular_expression_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // parts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->parts.size);
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismInterpolatedRegularExpressionNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_STRING_NODE: {
                    pm_interpolated_string_node_t *cast = (pm_interpolated_string_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // parts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->parts.size);
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismInterpolatedStringNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_SYMBOL_NODE: {
                    pm_interpolated_symbol_node_t *cast = (pm_interpolated_symbol_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // parts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->parts.size);
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismInterpolatedSymbolNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_INTERPOLATED_X_STRING_NODE: {
                    pm_interpolated_x_string_node_t *cast = (pm_interpolated_x_string_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // parts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->parts.size);
                    for (size_t index = 0; index < cast->parts.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismInterpolatedXStringNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IT_LOCAL_VARIABLE_READ_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismItLocalVariableReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_IT_PARAMETERS_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismItParametersNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_KEYWORD_HASH_NODE: {
                    pm_keyword_hash_node_t *cast = (pm_keyword_hash_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // elements
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->elements.size);
                    for (size_t index = 0; index < cast->elements.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismKeywordHashNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_KEYWORD_REST_PARAMETER_NODE: {
                    pm_keyword_rest_parameter_node_t *cast = (pm_keyword_rest_parameter_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
                    argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->name_loc.start == NULL ? Qnil : pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismKeywordRestParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LAMBDA_NODE: {
                    pm_lambda_node_t *cast = (pm_lambda_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // parameters
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismLambdaNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
                    pm_local_variable_and_write_node_t *cast = (pm_local_variable_and_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->name - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = ULONG2NUM(cast->depth);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismLocalVariableAndWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
                    pm_local_variable_operator_write_node_t *cast = (pm_local_variable_operator_write_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // binary_operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->name - 1);

                    // binary_operator
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->binary_operator != 0);
                    argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = ULONG2NUM(cast->depth);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismLocalVariableOperatorWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
                    pm_local_variable_or_write_node_t *cast = (pm_local_variable_or_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[7] = RARRAY_AREF(constants, cast->name - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = ULONG2NUM(cast->depth);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismLocalVariableOrWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_READ_NODE: {
                    pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = ULONG2NUM(cast->depth);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismLocalVariableReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_TARGET_NODE: {
                    pm_local_variable_target_node_t *cast = (pm_local_variable_target_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = ULONG2NUM(cast->depth);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismLocalVariableTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_LOCAL_VARIABLE_WRITE_NODE: {
                    pm_local_variable_write_node_t *cast = (pm_local_variable_write_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // depth
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = ULONG2NUM(cast->depth);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismLocalVariableWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_LAST_LINE_NODE: {
                    pm_match_last_line_node_t *cast = (pm_match_last_line_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // content_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->content_loc.start, cast->content_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // unescaped
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_string_new(&cast->unescaped, encoding);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismMatchLastLineNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_PREDICATE_NODE: {
                    pm_match_predicate_node_t *cast = (pm_match_predicate_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // pattern
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismMatchPredicateNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_REQUIRED_NODE: {
                    pm_match_required_node_t *cast = (pm_match_required_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // pattern
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismMatchRequiredNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MATCH_WRITE_NODE: {
                    pm_match_write_node_t *cast = (pm_match_write_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // call
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // targets
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->targets.size);
                    for (size_t index = 0; index < cast->targets.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismMatchWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MISSING_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismMissingNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MODULE_NODE: {
                    pm_module_node_t *cast = (pm_module_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // module_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->module_keyword_loc.start, cast->module_keyword_loc.end, source, freeze);

                    // constant_path
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[9] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismModuleNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MULTI_TARGET_NODE: {
                    pm_multi_target_node_t *cast = (pm_multi_target_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // lefts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->lefts.size);
                    for (size_t index = 0; index < cast->lefts.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // rights
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_new_capa(cast->rights.size);
                    for (size_t index = 0; index < cast->rights.size; index++) {
                        rb_ary_push(argv[6], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[6]);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismMultiTargetNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_MULTI_WRITE_NODE: {
                    pm_multi_write_node_t *cast = (pm_multi_write_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // lefts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->lefts.size);
                    for (size_t index = 0; index < cast->lefts.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // rights
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_new_capa(cast->rights.size);
                    for (size_t index = 0; index < cast->rights.size; index++) {
                        rb_ary_push(argv[6], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[6]);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismMultiWriteNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NEXT_NODE: {
                    pm_next_node_t *cast = (pm_next_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismNextNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NIL_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismNilNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NO_KEYWORDS_PARAMETER_NODE: {
                    pm_no_keywords_parameter_node_t *cast = (pm_no_keywords_parameter_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismNoKeywordsParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NUMBERED_PARAMETERS_NODE: {
                    pm_numbered_parameters_node_t *cast = (pm_numbered_parameters_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // maximum
#line 246 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = UINT2NUM(cast->maximum);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismNumberedParametersNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_NUMBERED_REFERENCE_READ_NODE: {
                    pm_numbered_reference_read_node_t *cast = (pm_numbered_reference_read_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // number
#line 249 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = ULONG2NUM(cast->number);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismNumberedReferenceReadNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
                    pm_optional_keyword_parameter_node_t *cast = (pm_optional_keyword_parameter_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismOptionalKeywordParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OPTIONAL_PARAMETER_NODE: {
                    pm_optional_parameter_node_t *cast = (pm_optional_parameter_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // value
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismOptionalParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_OR_NODE: {
                    pm_or_node_t *cast = (pm_or_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismOrNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PARAMETERS_NODE: {
                    pm_parameters_node_t *cast = (pm_parameters_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // requireds
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->requireds.size);
                    for (size_t index = 0; index < cast->requireds.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // optionals
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->optionals.size);
                    for (size_t index = 0; index < cast->optionals.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // posts
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_new_capa(cast->posts.size);
                    for (size_t index = 0; index < cast->posts.size; index++) {
                        rb_ary_push(argv[7], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[7]);

                    // keywords
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_new_capa(cast->keywords.size);
                    for (size_t index = 0; index < cast->keywords.size; index++) {
                        rb_ary_push(argv[8], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[8]);

                    // keyword_rest
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismParametersNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PARENTHESES_NODE: {
                    pm_parentheses_node_t *cast = (pm_parentheses_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismParenthesesNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PINNED_EXPRESSION_NODE: {
                    pm_pinned_expression_node_t *cast = (pm_pinned_expression_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // lparen_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // rparen_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismPinnedExpressionNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PINNED_VARIABLE_NODE: {
                    pm_pinned_variable_node_t *cast = (pm_pinned_variable_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // variable
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismPinnedVariableNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_POST_EXECUTION_NODE: {
                    pm_post_execution_node_t *cast = (pm_post_execution_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismPostExecutionNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PRE_EXECUTION_NODE: {
                    pm_pre_execution_node_t *cast = (pm_pre_execution_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismPreExecutionNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_PROGRAM_NODE: {
                    pm_program_node_t *cast = (pm_program_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismProgramNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RANGE_NODE: {
                    pm_range_node_t *cast = (pm_range_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // left
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // right
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismRangeNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RATIONAL_NODE: {
                    pm_rational_node_t *cast = (pm_rational_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // numerator
#line 252 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_integer_new(&cast->numerator);

                    // denominator
#line 252 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_integer_new(&cast->denominator);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismRationalNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_REDO_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismRedoNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_REGULAR_EXPRESSION_NODE: {
                    pm_regular_expression_node_t *cast = (pm_regular_expression_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // content_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->content_loc.start, cast->content_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // unescaped
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_string_new(&cast->unescaped, encoding);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismRegularExpressionNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
                    pm_required_keyword_parameter_node_t *cast = (pm_required_keyword_parameter_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismRequiredKeywordParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_REQUIRED_PARAMETER_NODE: {
                    pm_required_parameter_node_t *cast = (pm_required_parameter_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
#line 226 "prism/templates/ext/prism/api_node.c.erb"
                    assert(cast->name != 0);
                    argv[4] = RARRAY_AREF(constants, cast->name - 1);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismRequiredParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RESCUE_MODIFIER_NODE: {
                    pm_rescue_modifier_node_t *cast = (pm_rescue_modifier_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // rescue_expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismRescueModifierNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RESCUE_NODE: {
                    pm_rescue_node_t *cast = (pm_rescue_node_t *) node;
                    VALUE argv[11];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // exceptions
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->exceptions.size);
                    for (size_t index = 0; index < cast->exceptions.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // operator_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->operator_loc.start == NULL ? Qnil : pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // reference
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // then_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = cast->then_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->then_keyword_loc.start, cast->then_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = rb_ary_pop(value_stack);

                    // subsequent
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[10] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(11, argv, rb_cPrismRescueNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_REST_PARAMETER_NODE: {
                    pm_rest_parameter_node_t *cast = (pm_rest_parameter_node_t *) node;
                    VALUE argv[7];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // name
                    argv[4] = cast->name == 0 ? Qnil : RARRAY_AREF(constants, cast->name - 1);

                    // name_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->name_loc.start == NULL ? Qnil : pm_location_new(parser, cast->name_loc.start, cast->name_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(7, argv, rb_cPrismRestParameterNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RETRY_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismRetryNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_RETURN_NODE: {
                    pm_return_node_t *cast = (pm_return_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismReturnNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SELF_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismSelfNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SHAREABLE_CONSTANT_NODE: {
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // write
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismShareableConstantNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SINGLETON_CLASS_NODE: {
                    pm_singleton_class_node_t *cast = (pm_singleton_class_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // locals
#line 232 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->locals.size);
                    for (size_t index = 0; index < cast->locals.size; index++) {
                        assert(cast->locals.ids[index] != 0);
                        rb_ary_push(argv[4], RARRAY_AREF(constants, cast->locals.ids[index] - 1));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // class_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->class_keyword_loc.start, cast->class_keyword_loc.end, source, freeze);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // body
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismSingletonClassNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SOURCE_ENCODING_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismSourceEncodingNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SOURCE_FILE_NODE: {
                    pm_source_file_node_t *cast = (pm_source_file_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // filepath
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_string_new(&cast->filepath, encoding);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismSourceFileNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SOURCE_LINE_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismSourceLineNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SPLAT_NODE: {
                    pm_splat_node_t *cast = (pm_splat_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // operator_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->operator_loc.start, cast->operator_loc.end, source, freeze);

                    // expression
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismSplatNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_STATEMENTS_NODE: {
                    pm_statements_node_t *cast = (pm_statements_node_t *) node;
                    VALUE argv[5];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // body
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->body.size);
                    for (size_t index = 0; index < cast->body.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    VALUE value = rb_class_new_instance(5, argv, rb_cPrismStatementsNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_STRING_NODE: {
                    pm_string_node_t *cast = (pm_string_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // content_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->content_loc.start, cast->content_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // unescaped
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_string_new(&cast->unescaped, encoding);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismStringNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SUPER_NODE: {
                    pm_super_node_t *cast = (pm_super_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    // block
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismSuperNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_SYMBOL_NODE: {
                    pm_symbol_node_t *cast = (pm_symbol_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = cast->opening_loc.start == NULL ? Qnil : pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // value_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->value_loc.start == NULL ? Qnil : pm_location_new(parser, cast->value_loc.start, cast->value_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // unescaped
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_string_new(&cast->unescaped, encoding);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismSymbolNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_TRUE_NODE: {
                    VALUE argv[4];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    VALUE value = rb_class_new_instance(4, argv, rb_cPrismTrueNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNDEF_NODE: {
                    pm_undef_node_t *cast = (pm_undef_node_t *) node;
                    VALUE argv[6];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // names
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = rb_ary_new_capa(cast->names.size);
                    for (size_t index = 0; index < cast->names.size; index++) {
                        rb_ary_push(argv[4], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[4]);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(6, argv, rb_cPrismUndefNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNLESS_NODE: {
                    pm_unless_node_t *cast = (pm_unless_node_t *) node;
                    VALUE argv[10];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_pop(value_stack);

                    // then_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->then_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->then_keyword_loc.start, cast->then_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // else_clause
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    // end_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[9] = cast->end_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->end_keyword_loc.start, cast->end_keyword_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(10, argv, rb_cPrismUnlessNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_UNTIL_NODE: {
                    pm_until_node_t *cast = (pm_until_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // do_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->do_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->do_keyword_loc.start, cast->do_keyword_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismUntilNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_WHEN_NODE: {
                    pm_when_node_t *cast = (pm_when_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // conditions
#line 216 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = rb_ary_new_capa(cast->conditions.size);
                    for (size_t index = 0; index < cast->conditions.size; index++) {
                        rb_ary_push(argv[5], rb_ary_pop(value_stack));
                    }
                    if (freeze) rb_obj_freeze(argv[5]);

                    // then_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->then_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->then_keyword_loc.start, cast->then_keyword_loc.end, source, freeze);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismWhenNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_WHILE_NODE: {
                    pm_while_node_t *cast = (pm_while_node_t *) node;
                    VALUE argv[9];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // do_keyword_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->do_keyword_loc.start == NULL ? Qnil : pm_location_new(parser, cast->do_keyword_loc.start, cast->do_keyword_loc.end, source, freeze);

                    // closing_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = cast->closing_loc.start == NULL ? Qnil : pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // predicate
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = rb_ary_pop(value_stack);

                    // statements
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[8] = rb_ary_pop(value_stack);

                    VALUE value = rb_class_new_instance(9, argv, rb_cPrismWhileNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_X_STRING_NODE: {
                    pm_x_string_node_t *cast = (pm_x_string_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // opening_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->opening_loc.start, cast->opening_loc.end, source, freeze);

                    // content_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = pm_location_new(parser, cast->content_loc.start, cast->content_loc.end, source, freeze);

                    // closing_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = pm_location_new(parser, cast->closing_loc.start, cast->closing_loc.end, source, freeze);

                    // unescaped
#line 223 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = pm_string_new(&cast->unescaped, encoding);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismXStringNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
#line 190 "prism/templates/ext/prism/api_node.c.erb"
                case PM_YIELD_NODE: {
                    pm_yield_node_t *cast = (pm_yield_node_t *) node;
                    VALUE argv[8];

                    // source
                    argv[0] = source;

                    // node_id
                    argv[1] = ULONG2NUM(node->node_id);

                    // location
                    argv[2] = pm_location_new(parser, node->location.start, node->location.end, source, freeze);

                    // flags
                    argv[3] = ULONG2NUM(node->flags);

                    // keyword_loc
#line 240 "prism/templates/ext/prism/api_node.c.erb"
                    argv[4] = pm_location_new(parser, cast->keyword_loc.start, cast->keyword_loc.end, source, freeze);

                    // lparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[5] = cast->lparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->lparen_loc.start, cast->lparen_loc.end, source, freeze);

                    // arguments
#line 213 "prism/templates/ext/prism/api_node.c.erb"
                    argv[6] = rb_ary_pop(value_stack);

                    // rparen_loc
#line 243 "prism/templates/ext/prism/api_node.c.erb"
                    argv[7] = cast->rparen_loc.start == NULL ? Qnil : pm_location_new(parser, cast->rparen_loc.start, cast->rparen_loc.end, source, freeze);

                    VALUE value = rb_class_new_instance(8, argv, rb_cPrismYieldNode);
                    if (freeze) rb_obj_freeze(value);

                    rb_ary_push(value_stack, value);
                    break;
                }
                default:
                    rb_raise(rb_eRuntimeError, "unknown node type: %d", PM_NODE_TYPE(node));
            }
        }
    }

    return rb_ary_pop(value_stack);
}

void
Init_prism_api_node(void) {
    rb_cPrismAliasGlobalVariableNode = rb_define_class_under(rb_cPrism, "AliasGlobalVariableNode", rb_cPrismNode);
    rb_cPrismAliasMethodNode = rb_define_class_under(rb_cPrism, "AliasMethodNode", rb_cPrismNode);
    rb_cPrismAlternationPatternNode = rb_define_class_under(rb_cPrism, "AlternationPatternNode", rb_cPrismNode);
    rb_cPrismAndNode = rb_define_class_under(rb_cPrism, "AndNode", rb_cPrismNode);
    rb_cPrismArgumentsNode = rb_define_class_under(rb_cPrism, "ArgumentsNode", rb_cPrismNode);
    rb_cPrismArrayNode = rb_define_class_under(rb_cPrism, "ArrayNode", rb_cPrismNode);
    rb_cPrismArrayPatternNode = rb_define_class_under(rb_cPrism, "ArrayPatternNode", rb_cPrismNode);
    rb_cPrismAssocNode = rb_define_class_under(rb_cPrism, "AssocNode", rb_cPrismNode);
    rb_cPrismAssocSplatNode = rb_define_class_under(rb_cPrism, "AssocSplatNode", rb_cPrismNode);
    rb_cPrismBackReferenceReadNode = rb_define_class_under(rb_cPrism, "BackReferenceReadNode", rb_cPrismNode);
    rb_cPrismBeginNode = rb_define_class_under(rb_cPrism, "BeginNode", rb_cPrismNode);
    rb_cPrismBlockArgumentNode = rb_define_class_under(rb_cPrism, "BlockArgumentNode", rb_cPrismNode);
    rb_cPrismBlockLocalVariableNode = rb_define_class_under(rb_cPrism, "BlockLocalVariableNode", rb_cPrismNode);
    rb_cPrismBlockNode = rb_define_class_under(rb_cPrism, "BlockNode", rb_cPrismNode);
    rb_cPrismBlockParameterNode = rb_define_class_under(rb_cPrism, "BlockParameterNode", rb_cPrismNode);
    rb_cPrismBlockParametersNode = rb_define_class_under(rb_cPrism, "BlockParametersNode", rb_cPrismNode);
    rb_cPrismBreakNode = rb_define_class_under(rb_cPrism, "BreakNode", rb_cPrismNode);
    rb_cPrismCallAndWriteNode = rb_define_class_under(rb_cPrism, "CallAndWriteNode", rb_cPrismNode);
    rb_cPrismCallNode = rb_define_class_under(rb_cPrism, "CallNode", rb_cPrismNode);
    rb_cPrismCallOperatorWriteNode = rb_define_class_under(rb_cPrism, "CallOperatorWriteNode", rb_cPrismNode);
    rb_cPrismCallOrWriteNode = rb_define_class_under(rb_cPrism, "CallOrWriteNode", rb_cPrismNode);
    rb_cPrismCallTargetNode = rb_define_class_under(rb_cPrism, "CallTargetNode", rb_cPrismNode);
    rb_cPrismCapturePatternNode = rb_define_class_under(rb_cPrism, "CapturePatternNode", rb_cPrismNode);
    rb_cPrismCaseMatchNode = rb_define_class_under(rb_cPrism, "CaseMatchNode", rb_cPrismNode);
    rb_cPrismCaseNode = rb_define_class_under(rb_cPrism, "CaseNode", rb_cPrismNode);
    rb_cPrismClassNode = rb_define_class_under(rb_cPrism, "ClassNode", rb_cPrismNode);
    rb_cPrismClassVariableAndWriteNode = rb_define_class_under(rb_cPrism, "ClassVariableAndWriteNode", rb_cPrismNode);
    rb_cPrismClassVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "ClassVariableOperatorWriteNode", rb_cPrismNode);
    rb_cPrismClassVariableOrWriteNode = rb_define_class_under(rb_cPrism, "ClassVariableOrWriteNode", rb_cPrismNode);
    rb_cPrismClassVariableReadNode = rb_define_class_under(rb_cPrism, "ClassVariableReadNode", rb_cPrismNode);
    rb_cPrismClassVariableTargetNode = rb_define_class_under(rb_cPrism, "ClassVariableTargetNode", rb_cPrismNode);
    rb_cPrismClassVariableWriteNode = rb_define_class_under(rb_cPrism, "ClassVariableWriteNode", rb_cPrismNode);
    rb_cPrismConstantAndWriteNode = rb_define_class_under(rb_cPrism, "ConstantAndWriteNode", rb_cPrismNode);
    rb_cPrismConstantOperatorWriteNode = rb_define_class_under(rb_cPrism, "ConstantOperatorWriteNode", rb_cPrismNode);
    rb_cPrismConstantOrWriteNode = rb_define_class_under(rb_cPrism, "ConstantOrWriteNode", rb_cPrismNode);
    rb_cPrismConstantPathAndWriteNode = rb_define_class_under(rb_cPrism, "ConstantPathAndWriteNode", rb_cPrismNode);
    rb_cPrismConstantPathNode = rb_define_class_under(rb_cPrism, "ConstantPathNode", rb_cPrismNode);
    rb_cPrismConstantPathOperatorWriteNode = rb_define_class_under(rb_cPrism, "ConstantPathOperatorWriteNode", rb_cPrismNode);
    rb_cPrismConstantPathOrWriteNode = rb_define_class_under(rb_cPrism, "ConstantPathOrWriteNode", rb_cPrismNode);
    rb_cPrismConstantPathTargetNode = rb_define_class_under(rb_cPrism, "ConstantPathTargetNode", rb_cPrismNode);
    rb_cPrismConstantPathWriteNode = rb_define_class_under(rb_cPrism, "ConstantPathWriteNode", rb_cPrismNode);
    rb_cPrismConstantReadNode = rb_define_class_under(rb_cPrism, "ConstantReadNode", rb_cPrismNode);
    rb_cPrismConstantTargetNode = rb_define_class_under(rb_cPrism, "ConstantTargetNode", rb_cPrismNode);
    rb_cPrismConstantWriteNode = rb_define_class_under(rb_cPrism, "ConstantWriteNode", rb_cPrismNode);
    rb_cPrismDefNode = rb_define_class_under(rb_cPrism, "DefNode", rb_cPrismNode);
    rb_cPrismDefinedNode = rb_define_class_under(rb_cPrism, "DefinedNode", rb_cPrismNode);
    rb_cPrismElseNode = rb_define_class_under(rb_cPrism, "ElseNode", rb_cPrismNode);
    rb_cPrismEmbeddedStatementsNode = rb_define_class_under(rb_cPrism, "EmbeddedStatementsNode", rb_cPrismNode);
    rb_cPrismEmbeddedVariableNode = rb_define_class_under(rb_cPrism, "EmbeddedVariableNode", rb_cPrismNode);
    rb_cPrismEnsureNode = rb_define_class_under(rb_cPrism, "EnsureNode", rb_cPrismNode);
    rb_cPrismFalseNode = rb_define_class_under(rb_cPrism, "FalseNode", rb_cPrismNode);
    rb_cPrismFindPatternNode = rb_define_class_under(rb_cPrism, "FindPatternNode", rb_cPrismNode);
    rb_cPrismFlipFlopNode = rb_define_class_under(rb_cPrism, "FlipFlopNode", rb_cPrismNode);
    rb_cPrismFloatNode = rb_define_class_under(rb_cPrism, "FloatNode", rb_cPrismNode);
    rb_cPrismForNode = rb_define_class_under(rb_cPrism, "ForNode", rb_cPrismNode);
    rb_cPrismForwardingArgumentsNode = rb_define_class_under(rb_cPrism, "ForwardingArgumentsNode", rb_cPrismNode);
    rb_cPrismForwardingParameterNode = rb_define_class_under(rb_cPrism, "ForwardingParameterNode", rb_cPrismNode);
    rb_cPrismForwardingSuperNode = rb_define_class_under(rb_cPrism, "ForwardingSuperNode", rb_cPrismNode);
    rb_cPrismGlobalVariableAndWriteNode = rb_define_class_under(rb_cPrism, "GlobalVariableAndWriteNode", rb_cPrismNode);
    rb_cPrismGlobalVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "GlobalVariableOperatorWriteNode", rb_cPrismNode);
    rb_cPrismGlobalVariableOrWriteNode = rb_define_class_under(rb_cPrism, "GlobalVariableOrWriteNode", rb_cPrismNode);
    rb_cPrismGlobalVariableReadNode = rb_define_class_under(rb_cPrism, "GlobalVariableReadNode", rb_cPrismNode);
    rb_cPrismGlobalVariableTargetNode = rb_define_class_under(rb_cPrism, "GlobalVariableTargetNode", rb_cPrismNode);
    rb_cPrismGlobalVariableWriteNode = rb_define_class_under(rb_cPrism, "GlobalVariableWriteNode", rb_cPrismNode);
    rb_cPrismHashNode = rb_define_class_under(rb_cPrism, "HashNode", rb_cPrismNode);
    rb_cPrismHashPatternNode = rb_define_class_under(rb_cPrism, "HashPatternNode", rb_cPrismNode);
    rb_cPrismIfNode = rb_define_class_under(rb_cPrism, "IfNode", rb_cPrismNode);
    rb_cPrismImaginaryNode = rb_define_class_under(rb_cPrism, "ImaginaryNode", rb_cPrismNode);
    rb_cPrismImplicitNode = rb_define_class_under(rb_cPrism, "ImplicitNode", rb_cPrismNode);
    rb_cPrismImplicitRestNode = rb_define_class_under(rb_cPrism, "ImplicitRestNode", rb_cPrismNode);
    rb_cPrismInNode = rb_define_class_under(rb_cPrism, "InNode", rb_cPrismNode);
    rb_cPrismIndexAndWriteNode = rb_define_class_under(rb_cPrism, "IndexAndWriteNode", rb_cPrismNode);
    rb_cPrismIndexOperatorWriteNode = rb_define_class_under(rb_cPrism, "IndexOperatorWriteNode", rb_cPrismNode);
    rb_cPrismIndexOrWriteNode = rb_define_class_under(rb_cPrism, "IndexOrWriteNode", rb_cPrismNode);
    rb_cPrismIndexTargetNode = rb_define_class_under(rb_cPrism, "IndexTargetNode", rb_cPrismNode);
    rb_cPrismInstanceVariableAndWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableAndWriteNode", rb_cPrismNode);
    rb_cPrismInstanceVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOperatorWriteNode", rb_cPrismNode);
    rb_cPrismInstanceVariableOrWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableOrWriteNode", rb_cPrismNode);
    rb_cPrismInstanceVariableReadNode = rb_define_class_under(rb_cPrism, "InstanceVariableReadNode", rb_cPrismNode);
    rb_cPrismInstanceVariableTargetNode = rb_define_class_under(rb_cPrism, "InstanceVariableTargetNode", rb_cPrismNode);
    rb_cPrismInstanceVariableWriteNode = rb_define_class_under(rb_cPrism, "InstanceVariableWriteNode", rb_cPrismNode);
    rb_cPrismIntegerNode = rb_define_class_under(rb_cPrism, "IntegerNode", rb_cPrismNode);
    rb_cPrismInterpolatedMatchLastLineNode = rb_define_class_under(rb_cPrism, "InterpolatedMatchLastLineNode", rb_cPrismNode);
    rb_cPrismInterpolatedRegularExpressionNode = rb_define_class_under(rb_cPrism, "InterpolatedRegularExpressionNode", rb_cPrismNode);
    rb_cPrismInterpolatedStringNode = rb_define_class_under(rb_cPrism, "InterpolatedStringNode", rb_cPrismNode);
    rb_cPrismInterpolatedSymbolNode = rb_define_class_under(rb_cPrism, "InterpolatedSymbolNode", rb_cPrismNode);
    rb_cPrismInterpolatedXStringNode = rb_define_class_under(rb_cPrism, "InterpolatedXStringNode", rb_cPrismNode);
    rb_cPrismItLocalVariableReadNode = rb_define_class_under(rb_cPrism, "ItLocalVariableReadNode", rb_cPrismNode);
    rb_cPrismItParametersNode = rb_define_class_under(rb_cPrism, "ItParametersNode", rb_cPrismNode);
    rb_cPrismKeywordHashNode = rb_define_class_under(rb_cPrism, "KeywordHashNode", rb_cPrismNode);
    rb_cPrismKeywordRestParameterNode = rb_define_class_under(rb_cPrism, "KeywordRestParameterNode", rb_cPrismNode);
    rb_cPrismLambdaNode = rb_define_class_under(rb_cPrism, "LambdaNode", rb_cPrismNode);
    rb_cPrismLocalVariableAndWriteNode = rb_define_class_under(rb_cPrism, "LocalVariableAndWriteNode", rb_cPrismNode);
    rb_cPrismLocalVariableOperatorWriteNode = rb_define_class_under(rb_cPrism, "LocalVariableOperatorWriteNode", rb_cPrismNode);
    rb_cPrismLocalVariableOrWriteNode = rb_define_class_under(rb_cPrism, "LocalVariableOrWriteNode", rb_cPrismNode);
    rb_cPrismLocalVariableReadNode = rb_define_class_under(rb_cPrism, "LocalVariableReadNode", rb_cPrismNode);
    rb_cPrismLocalVariableTargetNode = rb_define_class_under(rb_cPrism, "LocalVariableTargetNode", rb_cPrismNode);
    rb_cPrismLocalVariableWriteNode = rb_define_class_under(rb_cPrism, "LocalVariableWriteNode", rb_cPrismNode);
    rb_cPrismMatchLastLineNode = rb_define_class_under(rb_cPrism, "MatchLastLineNode", rb_cPrismNode);
    rb_cPrismMatchPredicateNode = rb_define_class_under(rb_cPrism, "MatchPredicateNode", rb_cPrismNode);
    rb_cPrismMatchRequiredNode = rb_define_class_under(rb_cPrism, "MatchRequiredNode", rb_cPrismNode);
    rb_cPrismMatchWriteNode = rb_define_class_under(rb_cPrism, "MatchWriteNode", rb_cPrismNode);
    rb_cPrismMissingNode = rb_define_class_under(rb_cPrism, "MissingNode", rb_cPrismNode);
    rb_cPrismModuleNode = rb_define_class_under(rb_cPrism, "ModuleNode", rb_cPrismNode);
    rb_cPrismMultiTargetNode = rb_define_class_under(rb_cPrism, "MultiTargetNode", rb_cPrismNode);
    rb_cPrismMultiWriteNode = rb_define_class_under(rb_cPrism, "MultiWriteNode", rb_cPrismNode);
    rb_cPrismNextNode = rb_define_class_under(rb_cPrism, "NextNode", rb_cPrismNode);
    rb_cPrismNilNode = rb_define_class_under(rb_cPrism, "NilNode", rb_cPrismNode);
    rb_cPrismNoKeywordsParameterNode = rb_define_class_under(rb_cPrism, "NoKeywordsParameterNode", rb_cPrismNode);
    rb_cPrismNumberedParametersNode = rb_define_class_under(rb_cPrism, "NumberedParametersNode", rb_cPrismNode);
    rb_cPrismNumberedReferenceReadNode = rb_define_class_under(rb_cPrism, "NumberedReferenceReadNode", rb_cPrismNode);
    rb_cPrismOptionalKeywordParameterNode = rb_define_class_under(rb_cPrism, "OptionalKeywordParameterNode", rb_cPrismNode);
    rb_cPrismOptionalParameterNode = rb_define_class_under(rb_cPrism, "OptionalParameterNode", rb_cPrismNode);
    rb_cPrismOrNode = rb_define_class_under(rb_cPrism, "OrNode", rb_cPrismNode);
    rb_cPrismParametersNode = rb_define_class_under(rb_cPrism, "ParametersNode", rb_cPrismNode);
    rb_cPrismParenthesesNode = rb_define_class_under(rb_cPrism, "ParenthesesNode", rb_cPrismNode);
    rb_cPrismPinnedExpressionNode = rb_define_class_under(rb_cPrism, "PinnedExpressionNode", rb_cPrismNode);
    rb_cPrismPinnedVariableNode = rb_define_class_under(rb_cPrism, "PinnedVariableNode", rb_cPrismNode);
    rb_cPrismPostExecutionNode = rb_define_class_under(rb_cPrism, "PostExecutionNode", rb_cPrismNode);
    rb_cPrismPreExecutionNode = rb_define_class_under(rb_cPrism, "PreExecutionNode", rb_cPrismNode);
    rb_cPrismProgramNode = rb_define_class_under(rb_cPrism, "ProgramNode", rb_cPrismNode);
    rb_cPrismRangeNode = rb_define_class_under(rb_cPrism, "RangeNode", rb_cPrismNode);
    rb_cPrismRationalNode = rb_define_class_under(rb_cPrism, "RationalNode", rb_cPrismNode);
    rb_cPrismRedoNode = rb_define_class_under(rb_cPrism, "RedoNode", rb_cPrismNode);
    rb_cPrismRegularExpressionNode = rb_define_class_under(rb_cPrism, "RegularExpressionNode", rb_cPrismNode);
    rb_cPrismRequiredKeywordParameterNode = rb_define_class_under(rb_cPrism, "RequiredKeywordParameterNode", rb_cPrismNode);
    rb_cPrismRequiredParameterNode = rb_define_class_under(rb_cPrism, "RequiredParameterNode", rb_cPrismNode);
    rb_cPrismRescueModifierNode = rb_define_class_under(rb_cPrism, "RescueModifierNode", rb_cPrismNode);
    rb_cPrismRescueNode = rb_define_class_under(rb_cPrism, "RescueNode", rb_cPrismNode);
    rb_cPrismRestParameterNode = rb_define_class_under(rb_cPrism, "RestParameterNode", rb_cPrismNode);
    rb_cPrismRetryNode = rb_define_class_under(rb_cPrism, "RetryNode", rb_cPrismNode);
    rb_cPrismReturnNode = rb_define_class_under(rb_cPrism, "ReturnNode", rb_cPrismNode);
    rb_cPrismSelfNode = rb_define_class_under(rb_cPrism, "SelfNode", rb_cPrismNode);
    rb_cPrismShareableConstantNode = rb_define_class_under(rb_cPrism, "ShareableConstantNode", rb_cPrismNode);
    rb_cPrismSingletonClassNode = rb_define_class_under(rb_cPrism, "SingletonClassNode", rb_cPrismNode);
    rb_cPrismSourceEncodingNode = rb_define_class_under(rb_cPrism, "SourceEncodingNode", rb_cPrismNode);
    rb_cPrismSourceFileNode = rb_define_class_under(rb_cPrism, "SourceFileNode", rb_cPrismNode);
    rb_cPrismSourceLineNode = rb_define_class_under(rb_cPrism, "SourceLineNode", rb_cPrismNode);
    rb_cPrismSplatNode = rb_define_class_under(rb_cPrism, "SplatNode", rb_cPrismNode);
    rb_cPrismStatementsNode = rb_define_class_under(rb_cPrism, "StatementsNode", rb_cPrismNode);
    rb_cPrismStringNode = rb_define_class_under(rb_cPrism, "StringNode", rb_cPrismNode);
    rb_cPrismSuperNode = rb_define_class_under(rb_cPrism, "SuperNode", rb_cPrismNode);
    rb_cPrismSymbolNode = rb_define_class_under(rb_cPrism, "SymbolNode", rb_cPrismNode);
    rb_cPrismTrueNode = rb_define_class_under(rb_cPrism, "TrueNode", rb_cPrismNode);
    rb_cPrismUndefNode = rb_define_class_under(rb_cPrism, "UndefNode", rb_cPrismNode);
    rb_cPrismUnlessNode = rb_define_class_under(rb_cPrism, "UnlessNode", rb_cPrismNode);
    rb_cPrismUntilNode = rb_define_class_under(rb_cPrism, "UntilNode", rb_cPrismNode);
    rb_cPrismWhenNode = rb_define_class_under(rb_cPrism, "WhenNode", rb_cPrismNode);
    rb_cPrismWhileNode = rb_define_class_under(rb_cPrism, "WhileNode", rb_cPrismNode);
    rb_cPrismXStringNode = rb_define_class_under(rb_cPrism, "XStringNode", rb_cPrismNode);
    rb_cPrismYieldNode = rb_define_class_under(rb_cPrism, "YieldNode", rb_cPrismNode);
}
