Skip to content

Commit 313c726

Browse files
committed
Handle redefinable operators as identifier
1 parent 20af2f6 commit 313c726

File tree

1 file changed

+77
-20
lines changed

1 file changed

+77
-20
lines changed

lib/rdoc/ruby_lex.rb

Lines changed: 77 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -479,25 +479,44 @@ def lex_init()
479479
Token(TkNL)
480480
end
481481

482+
@OP.def_rules("=") do
483+
|op, io|
484+
case @lex_state
485+
when :EXPR_FNAME, :EXPR_DOT
486+
@lex_state = :EXPR_ARG
487+
else
488+
@lex_state = :EXPR_BEG
489+
end
490+
Token(op)
491+
end
492+
482493
@OP.def_rules("*", "**",
483-
"=", "==", "===",
494+
"==", "===",
484495
"=~", "<=>",
485496
"<", "<=",
486497
">", ">=", ">>") do
487498
|op, io|
488499
case @lex_state
489500
when :EXPR_FNAME, :EXPR_DOT
501+
tk = Token(TkId, op)
490502
@lex_state = :EXPR_ARG
491503
else
504+
tk = Token(op)
492505
@lex_state = :EXPR_BEG
493506
end
494-
Token(op)
507+
tk
495508
end
496509

497510
@OP.def_rules("!", "!=", "!~") do
498511
|op, io|
499-
@lex_state = :EXPR_BEG
500-
Token(op)
512+
case @lex_state
513+
when :EXPR_FNAME, :EXPR_DOT
514+
@lex_state = :EXPR_ARG
515+
Token(TkId, op)
516+
else
517+
@lex_state = :EXPR_BEG
518+
Token(op)
519+
end
501520
end
502521

503522
@OP.def_rules("<<") do
@@ -511,11 +530,12 @@ def lex_init()
511530
end
512531
end
513532
unless tk
514-
tk = Token(op)
515533
case @lex_state
516534
when :EXPR_FNAME, :EXPR_DOT
535+
tk = Token(TkId, op)
517536
@lex_state = :EXPR_ARG
518537
else
538+
tk = Token(op)
519539
@lex_state = :EXPR_BEG
520540
end
521541
end
@@ -529,9 +549,9 @@ def lex_init()
529549

530550
@OP.def_rules("`") do
531551
|op, io|
532-
if @lex_state == :EXPR_FNAME
533-
@lex_state = :EXPR_END
534-
Token(op)
552+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
553+
@lex_state = :EXPR_ARG
554+
Token(TkId, op)
535555
else
536556
identify_string(op)
537557
end
@@ -555,12 +575,25 @@ def lex_init()
555575
end
556576
end
557577

558-
@OP.def_rules("&", "&&", "|", "||") do
578+
@OP.def_rules("&&", "||") do
559579
|op, io|
560580
@lex_state = :EXPR_BEG
561581
Token(op)
562582
end
563583

584+
@OP.def_rules("&", "|") do
585+
|op, io|
586+
case @lex_state
587+
when :EXPR_FNAME, :EXPR_DOT
588+
tk = Token(TkId, op)
589+
@lex_state = :EXPR_ARG
590+
else
591+
tk = Token(op)
592+
@lex_state = :EXPR_BEG
593+
end
594+
tk
595+
end
596+
564597
@OP.def_rules("+=", "-=", "*=", "**=",
565598
"&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
566599
|op, io|
@@ -572,19 +605,23 @@ def lex_init()
572605
@OP.def_rule("+@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
573606
|op, io|
574607
@lex_state = :EXPR_ARG
575-
Token(op)
608+
Token(TkId, op)
576609
end
577610

578611
@OP.def_rule("-@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
579612
|op, io|
580613
@lex_state = :EXPR_ARG
614+
Token(TkId, op)
581615
Token(op)
582616
end
583617

584618
@OP.def_rules("+", "-") do
585619
|op, io|
586620
catch(:RET) do
587-
if @lex_state == :EXPR_ARG
621+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
622+
tk = Token(TkId, op)
623+
@lex_state = :EXPR_ARG
624+
elsif @lex_state == :EXPR_ARG
588625
if @space_seen and peek(0) =~ /[0-9]/
589626
throw :RET, identify_number(op)
590627
else
@@ -595,7 +632,8 @@ def lex_init()
595632
else
596633
@lex_state = :EXPR_BEG
597634
end
598-
Token(op)
635+
tk = Token(op) unless tk
636+
tk
599637
end
600638
end
601639

@@ -655,7 +693,10 @@ def lex_int2
655693

656694
@OP.def_rule("/") do
657695
|op, io|
658-
if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
696+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
697+
@lex_state = :EXPR_ARG
698+
Token(TkId, op)
699+
elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
659700
identify_string(op)
660701
elsif peek(0) == '='
661702
getc
@@ -671,8 +712,15 @@ def lex_int2
671712

672713
@OP.def_rules("^") do
673714
|op, io|
674-
@lex_state = :EXPR_BEG
675-
Token("^")
715+
case @lex_state
716+
when :EXPR_FNAME, :EXPR_DOT
717+
tk = Token(TkId, op)
718+
@lex_state = :EXPR_ARG
719+
else
720+
tk = Token(op)
721+
@lex_state = :EXPR_BEG
722+
end
723+
tk
676724
end
677725

678726
# @OP.def_rules("^=") do
@@ -699,8 +747,14 @@ def lex_int2
699747

700748
@OP.def_rule("~") do
701749
|op, io|
702-
@lex_state = :EXPR_BEG
703-
Token("~")
750+
case @lex_state
751+
when :EXPR_FNAME, :EXPR_DOT
752+
@lex_state = :EXPR_ARG
753+
Token(TkId, op)
754+
else
755+
@lex_state = :EXPR_BEG
756+
Token(op)
757+
end
704758
end
705759

706760
@OP.def_rule("~@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
@@ -726,13 +780,13 @@ def lex_int2
726780
@OP.def_rule("[]", proc{|op, io| @lex_state == :EXPR_FNAME}) do
727781
|op, io|
728782
@lex_state = :EXPR_ARG
729-
Token("[]")
783+
Token(TkId, op)
730784
end
731785

732786
@OP.def_rule("[]=", proc{|op, io| @lex_state == :EXPR_FNAME}) do
733787
|op, io|
734788
@lex_state = :EXPR_ARG
735-
Token("[]=")
789+
Token(TkId, op)
736790
end
737791

738792
@OP.def_rule("[") do
@@ -781,7 +835,10 @@ def lex_int2
781835

782836
@OP.def_rule('%') do
783837
|op, io|
784-
if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
838+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
839+
@lex_state = :EXPR_ARG
840+
Token(TkId, op)
841+
elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
785842
identify_quotation
786843
elsif peek(0) == '='
787844
getc

0 commit comments

Comments
 (0)