diff options
Diffstat (limited to 'prism/extension.c')
-rw-r--r-- | prism/extension.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/prism/extension.c b/prism/extension.c index 77d9881714..755876e561 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -554,6 +554,27 @@ parse_serialize_file_metadata(VALUE self, VALUE filepath, VALUE metadata) { return result; } +static VALUE +rb_prism_debug_inspect_node(VALUE self, VALUE source) { + pm_string_t input; + input_load_string(&input, source); + + pm_parser_t parser; + pm_parser_init(&parser, pm_string_source(&input), pm_string_length(&input), NULL); + + pm_node_t *node = pm_parse(&parser); + pm_buffer_t buffer = { 0 }; + + pm_prettyprint(&parser, node, &buffer); + VALUE string = rb_str_new(pm_buffer_value(&buffer), pm_buffer_length(&buffer)); + + pm_buffer_free(&buffer); + pm_node_destroy(&parser, node); + pm_parser_free(&parser); + + return string; +} + /******************************************************************************/ /* Initialization of the extension */ /******************************************************************************/ @@ -607,6 +628,8 @@ Init_prism(void) { rb_define_singleton_method(rb_cPrismDebug, "profile_file", profile_file, 1); rb_define_singleton_method(rb_cPrismDebug, "parse_serialize_file_metadata", parse_serialize_file_metadata, 2); + rb_define_singleton_method(rb_cPrismDebug, "inspect_node", rb_prism_debug_inspect_node, 1); + // Next, initialize the other APIs. Init_prism_api_node(); Init_prism_pack(); |