diff --git a/lib/rdoc/ruby_lex.rb b/lib/rdoc/ruby_lex.rb index 44cca09f73..5f39c6fc1d 100644 --- a/lib/rdoc/ruby_lex.rb +++ b/lib/rdoc/ruby_lex.rb @@ -479,25 +479,44 @@ def lex_init() Token(TkNL) end + @OP.def_rules("=") do + |op, io| + case @lex_state + when :EXPR_FNAME, :EXPR_DOT + @lex_state = :EXPR_ARG + else + @lex_state = :EXPR_BEG + end + Token(op) + end + @OP.def_rules("*", "**", - "=", "==", "===", + "==", "===", "=~", "<=>", "<", "<=", ">", ">=", ">>") do |op, io| case @lex_state when :EXPR_FNAME, :EXPR_DOT + tk = Token(TkId, op) @lex_state = :EXPR_ARG else + tk = Token(op) @lex_state = :EXPR_BEG end - Token(op) + tk end @OP.def_rules("!", "!=", "!~") do |op, io| - @lex_state = :EXPR_BEG - Token(op) + case @lex_state + when :EXPR_FNAME, :EXPR_DOT + @lex_state = :EXPR_ARG + Token(TkId, op) + else + @lex_state = :EXPR_BEG + Token(op) + end end @OP.def_rules("<<") do @@ -511,11 +530,12 @@ def lex_init() end end unless tk - tk = Token(op) case @lex_state when :EXPR_FNAME, :EXPR_DOT + tk = Token(TkId, op) @lex_state = :EXPR_ARG else + tk = Token(op) @lex_state = :EXPR_BEG end end @@ -529,9 +549,9 @@ def lex_init() @OP.def_rules("`") do |op, io| - if @lex_state == :EXPR_FNAME - @lex_state = :EXPR_END - Token(op) + if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state + @lex_state = :EXPR_ARG + Token(TkId, op) else identify_string(op) end @@ -555,12 +575,25 @@ def lex_init() end end - @OP.def_rules("&", "&&", "|", "||") do + @OP.def_rules("&&", "||") do |op, io| @lex_state = :EXPR_BEG Token(op) end + @OP.def_rules("&", "|") do + |op, io| + case @lex_state + when :EXPR_FNAME, :EXPR_DOT + tk = Token(TkId, op) + @lex_state = :EXPR_ARG + else + tk = Token(op) + @lex_state = :EXPR_BEG + end + tk + end + @OP.def_rules("+=", "-=", "*=", "**=", "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, io| @@ -572,19 +605,22 @@ def lex_init() @OP.def_rule("+@", proc{|op, io| @lex_state == :EXPR_FNAME}) do |op, io| @lex_state = :EXPR_ARG - Token(op) + Token(TkId, op) end @OP.def_rule("-@", proc{|op, io| @lex_state == :EXPR_FNAME}) do |op, io| @lex_state = :EXPR_ARG - Token(op) + Token(TkId, op) end @OP.def_rules("+", "-") do |op, io| catch(:RET) do - if @lex_state == :EXPR_ARG + if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state + tk = Token(TkId, op) + @lex_state = :EXPR_ARG + elsif @lex_state == :EXPR_ARG if @space_seen and peek(0) =~ /[0-9]/ throw :RET, identify_number(op) else @@ -595,7 +631,8 @@ def lex_init() else @lex_state = :EXPR_BEG end - Token(op) + tk = Token(op) unless tk + tk end end @@ -655,7 +692,10 @@ def lex_int2 @OP.def_rule("/") do |op, io| - if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID + if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state + @lex_state = :EXPR_ARG + Token(TkId, op) + elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID identify_string(op) elsif peek(0) == '=' getc @@ -671,8 +711,15 @@ def lex_int2 @OP.def_rules("^") do |op, io| - @lex_state = :EXPR_BEG - Token("^") + case @lex_state + when :EXPR_FNAME, :EXPR_DOT + tk = Token(TkId, op) + @lex_state = :EXPR_ARG + else + tk = Token(op) + @lex_state = :EXPR_BEG + end + tk end # @OP.def_rules("^=") do @@ -699,8 +746,14 @@ def lex_int2 @OP.def_rule("~") do |op, io| - @lex_state = :EXPR_BEG - Token("~") + case @lex_state + when :EXPR_FNAME, :EXPR_DOT + @lex_state = :EXPR_ARG + Token(TkId, op) + else + @lex_state = :EXPR_BEG + Token(op) + end end @OP.def_rule("~@", proc{|op, io| @lex_state == :EXPR_FNAME}) do @@ -726,13 +779,13 @@ def lex_int2 @OP.def_rule("[]", proc{|op, io| @lex_state == :EXPR_FNAME}) do |op, io| @lex_state = :EXPR_ARG - Token("[]") + Token(TkId, op) end @OP.def_rule("[]=", proc{|op, io| @lex_state == :EXPR_FNAME}) do |op, io| @lex_state = :EXPR_ARG - Token("[]=") + Token(TkId, op) end @OP.def_rule("[") do @@ -781,7 +834,10 @@ def lex_int2 @OP.def_rule('%') do |op, io| - if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID + if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state + @lex_state = :EXPR_ARG + Token(TkId, op) + elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID identify_quotation elsif peek(0) == '=' getc diff --git a/test/test_rdoc_markup_to_html.rb b/test/test_rdoc_markup_to_html.rb index 2e5b4b9300..21339c2938 100644 --- a/test/test_rdoc_markup_to_html.rb +++ b/test/test_rdoc_markup_to_html.rb @@ -485,6 +485,36 @@ def test_accept_verbatim_ruby assert_equal expected, @to.res.join end + def test_accept_verbatim_redefinable_operators + functions = %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~].map { |redefinable_op| + ["def #{redefinable_op}\n", "end\n"] + }.flatten + + verb = @RM::Verbatim.new(*functions) + + @to.start_accepting + @to.accept_verbatim verb + + expected = <<-EXPECTED + +
+    EXPECTED
+    expected = expected.rstrip
+
+    %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` !  != !~].each do |html_escaped_op|
+      expected += <<-EXPECTED
+def #{html_escaped_op}
+end
+      EXPECTED
+    end
+
+    expected += <<-EXPECTED
+
+EXPECTED + + assert_equal expected, @to.res.join + end + def test_convert_string assert_equal '<>', @to.convert_string('<>') end diff --git a/test/test_rdoc_parser_ruby.rb b/test/test_rdoc_parser_ruby.rb index c369590ec9..0c1aa073d4 100644 --- a/test/test_rdoc_parser_ruby.rb +++ b/test/test_rdoc_parser_ruby.rb @@ -1650,6 +1650,25 @@ def test_parse_method assert_equal stream, foo.token_stream end + def test_parse_redefinable_methods + klass = RDoc::NormalClass.new 'Foo' + klass.parent = @top_level + + comment = RDoc::Comment.new "", @top_level + + redefinable_ops = %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~] + redefinable_ops.each do |redefinable_op| + util_parser "def #{redefinable_op}\nend\n" + tk = @parser.get_tk + @parser.parse_method klass, RDoc::Parser::Ruby::NORMAL, tk, comment + end + + klass.method_list.each do |method| + assert_kind_of RDoc::RubyToken::TkId, method.token_stream[5] + assert_includes redefinable_ops, method.token_stream[5].text + end + end + def test_parse_method_bracket util_parser <<-RUBY class C