diff options
author | Nobuyoshi Nakada <[email protected]> | 2019-05-27 19:20:11 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2019-05-27 23:08:45 +0900 |
commit | c40003da25543b0f828911af56108ee16af35236 (patch) | |
tree | 1854f80559ea56c766cf3debcfdd7eb45c287730 /parse.y | |
parent | b3602f1d20baa4e5f29b2baff2c265461af78f56 (diff) |
Ripper#token
* parse.y (ripper_token): added Ripper#token which returns the
current token string. [EXPERIMENTAL]
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -12699,6 +12699,28 @@ ripper_state(VALUE self) return INT2NUM(p->lex.state); } +/* + * call-seq: + * ripper.token -> String + * + * Return the current token string. + */ +static VALUE +ripper_token(VALUE self) +{ + struct parser_params *p; + long pos, len; + + TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); + if (!ripper_initialized_p(p)) { + rb_raise(rb_eArgError, "method called for uninitialized object"); + } + if (NIL_P(p->parsing_thread)) return Qnil; + pos = p->lex.ptok - p->lex.pbeg; + len = p->lex.pcur - p->lex.ptok; + return rb_str_subseq(p->lex.lastline, pos, len); +} + #ifdef RIPPER_DEBUG /* :nodoc: */ static VALUE @@ -12762,6 +12784,7 @@ InitVM_ripper(void) rb_define_method(Ripper, "filename", ripper_filename, 0); rb_define_method(Ripper, "lineno", ripper_lineno, 0); rb_define_method(Ripper, "state", ripper_state, 0); + rb_define_method(Ripper, "token", ripper_token, 0); rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0); rb_define_method(Ripper, "encoding", rb_parser_encoding, 0); rb_define_method(Ripper, "yydebug", rb_parser_get_yydebug, 0); |