mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/psych/lib/psych/parser.rb (Mark): Adding a class to wrap
marker information * ext/psych/parser.c (mark): Add a method to return the mark object for the parser * test/psych/test_parser.rb: tests for the Mark class. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30588 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
eacee9d95f
commit
0b38e9bc9d
4 changed files with 93 additions and 3 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Tue Jan 18 04:42:44 2011 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||
|
||||
* ext/psych/lib/psych/parser.rb (Mark): Adding a class to wrap
|
||||
marker information
|
||||
|
||||
* ext/psych/parser.c (mark): Add a method to return the mark object
|
||||
for the parser
|
||||
|
||||
* test/psych/test_parser.rb: tests for the Mark class.
|
||||
|
||||
Tue Jan 18 02:46:55 2011 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||
|
||||
* ext/psych/lib/psych/visitors/json_tree.rb (visit_String): JSON
|
||||
|
|
|
@ -30,6 +30,9 @@ module Psych
|
|||
# construct an AST of the parsed YAML document.
|
||||
|
||||
class Parser
|
||||
class Mark < Struct.new(:index, :line, :column)
|
||||
end
|
||||
|
||||
# The handler on which events will be called
|
||||
attr_accessor :handler
|
||||
|
||||
|
|
|
@ -307,6 +307,28 @@ static VALUE set_external_encoding(VALUE self, VALUE encoding)
|
|||
return encoding;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* parser.mark # => #<Psych::Parser::Mark>
|
||||
*
|
||||
* Returns a Psych::Parser::Mark object that contains line, column, and index
|
||||
* information.
|
||||
*/
|
||||
static VALUE mark(VALUE self)
|
||||
{
|
||||
VALUE mark_klass;
|
||||
VALUE args[3];
|
||||
yaml_parser_t * parser;
|
||||
|
||||
Data_Get_Struct(self, yaml_parser_t, parser);
|
||||
mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark"));
|
||||
args[0] = INT2NUM(parser->mark.index);
|
||||
args[1] = INT2NUM(parser->mark.line);
|
||||
args[2] = INT2NUM(parser->mark.column);
|
||||
|
||||
return rb_class_new_instance(3, args, mark_klass);
|
||||
}
|
||||
|
||||
void Init_psych_parser()
|
||||
{
|
||||
#if 0
|
||||
|
@ -331,6 +353,7 @@ void Init_psych_parser()
|
|||
ePsychSyntaxError = rb_define_class_under(mPsych, "SyntaxError", rb_eSyntaxError);
|
||||
|
||||
rb_define_method(cPsychParser, "parse", parse, 1);
|
||||
rb_define_method(cPsychParser, "mark", mark, 0);
|
||||
rb_define_method(cPsychParser, "external_encoding=", set_external_encoding, 1);
|
||||
|
||||
id_read = rb_intern("read");
|
||||
|
|
|
@ -5,9 +5,12 @@ require_relative 'helper'
|
|||
module Psych
|
||||
class TestParser < TestCase
|
||||
class EventCatcher < Handler
|
||||
attr_reader :calls
|
||||
attr_accessor :parser
|
||||
attr_reader :calls, :marks
|
||||
def initialize
|
||||
@calls = []
|
||||
@parser = nil
|
||||
@calls = []
|
||||
@marks = []
|
||||
end
|
||||
|
||||
(Handler.instance_methods(true) -
|
||||
|
@ -15,6 +18,7 @@ module Psych
|
|||
class_eval %{
|
||||
def #{m} *args
|
||||
super
|
||||
@marks << @parser.mark if @parser
|
||||
@calls << [:#{m}, args]
|
||||
end
|
||||
}
|
||||
|
@ -23,7 +27,57 @@ module Psych
|
|||
|
||||
def setup
|
||||
super
|
||||
@parser = Psych::Parser.new EventCatcher.new
|
||||
@handler = EventCatcher.new
|
||||
@parser = Psych::Parser.new @handler
|
||||
@handler.parser = @parser
|
||||
end
|
||||
|
||||
def test_line_numbers
|
||||
assert_equal 0, @parser.mark.line
|
||||
@parser.parse "---\n- hello\n- world"
|
||||
line_calls = @handler.marks.map(&:line).zip(@handler.calls.map(&:first))
|
||||
assert_equal [[0, :start_stream],
|
||||
[0, :start_document],
|
||||
[1, :start_sequence],
|
||||
[2, :scalar],
|
||||
[3, :scalar],
|
||||
[3, :end_sequence],
|
||||
[3, :end_document],
|
||||
[3, :end_stream]], line_calls
|
||||
|
||||
assert_equal 3, @parser.mark.line
|
||||
end
|
||||
|
||||
def test_column_numbers
|
||||
assert_equal 0, @parser.mark.column
|
||||
@parser.parse "---\n- hello\n- world"
|
||||
col_calls = @handler.marks.map(&:column).zip(@handler.calls.map(&:first))
|
||||
assert_equal [[0, :start_stream],
|
||||
[3, :start_document],
|
||||
[1, :start_sequence],
|
||||
[0, :scalar],
|
||||
[0, :scalar],
|
||||
[0, :end_sequence],
|
||||
[0, :end_document],
|
||||
[0, :end_stream]], col_calls
|
||||
|
||||
assert_equal 0, @parser.mark.column
|
||||
end
|
||||
|
||||
def test_index_numbers
|
||||
assert_equal 0, @parser.mark.index
|
||||
@parser.parse "---\n- hello\n- world"
|
||||
idx_calls = @handler.marks.map(&:index).zip(@handler.calls.map(&:first))
|
||||
assert_equal [[0, :start_stream],
|
||||
[3, :start_document],
|
||||
[5, :start_sequence],
|
||||
[12, :scalar],
|
||||
[19, :scalar],
|
||||
[19, :end_sequence],
|
||||
[19, :end_document],
|
||||
[19, :end_stream]], idx_calls
|
||||
|
||||
assert_equal 19, @parser.mark.index
|
||||
end
|
||||
|
||||
def test_set_encoding_twice
|
||||
|
|
Loading…
Reference in a new issue