Skip to content

Commit

Permalink
Make sure operators parse correctly when used as method names (fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
adambeynon committed Oct 17, 2013
1 parent 736f52a commit 92bb9b2
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
32 changes: 16 additions & 16 deletions lib/opal/lexer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,8 @@ def next_token
return :OP_ASGN, '*'
else
result = '*'
if @lex_state == :expr_fname
@lex_state = :expr_end
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '*', result
elsif @space_seen && scanner.check(/\S/)
@lex_state = :expr_beg
Expand Down Expand Up @@ -544,8 +544,8 @@ def next_token
elsif scanner.scan(/\=/)
@lex_state = :expr_beg
return :OP_ASGN, '/'
elsif @lex_state == :expr_fname
@lex_state = :expr_end
elsif @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
elsif @lex_state == :expr_cmdarg || @lex_state == :expr_arg
if !scanner.check(/\s/) && @space_seen
@string_parse = { :beg => '/', :end => '/', :interpolate => true, :regexp => true }
Expand Down Expand Up @@ -690,8 +690,8 @@ def next_token
@lex_state = :expr_beg
return :OP_ASGN, '^'
elsif scanner.scan(/\^/)
if @lex_state == :expr_fname
@lex_state = :expr_end
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '^', scanner.matched
end

Expand All @@ -703,8 +703,8 @@ def next_token
@lex_state = :expr_beg
return :OP_ASGN, '<<'
elsif scanner.scan(/\<\</)
if @lex_state == :expr_fname
@lex_state = :expr_end
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return '<<', '<<'
elsif ![:expr_end, :expr_dot, :expr_endarg, :expr_class].include?(@lex_state) && @space_seen
if scanner.scan(/(-?)['"]?(\w+)['"]?/)
Expand Down Expand Up @@ -733,15 +733,15 @@ def next_token

return '<=>', '<=>'
elsif scanner.scan(/\<\=/)
if @lex_state == :expr_fname
@lex_state = :expr_end
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
return '<=', '<='
elsif scanner.scan(/\</)
if @lex_state == :expr_fname
@lex_state = :expr_end
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
end
Expand All @@ -759,14 +759,14 @@ def next_token
end
return '>>', '>>'
elsif scanner.scan(/\>\=/)
if @lex_state == :expr_fname
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_end
else
@lex_state = :expr_beg
end
return '>=', scanner.matched
elsif scanner.scan(/\>/)
if @lex_state == :expr_fname
if @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
else
@lex_state = :expr_beg
Expand All @@ -787,8 +787,8 @@ def next_token
if @lex_state == :expr_beg || @lex_state == :expr_mid
@lex_state = :expr_mid
return [sign, sign]
elsif @lex_state == :expr_fname
@lex_state = :expr_end
elsif @lex_state == :expr_fname or @lex_state == :expr_dot
@lex_state = :expr_arg
return [:IDENTIFIER, result + scanner.matched] if scanner.scan(/@/)
return [result, result]
end
Expand Down
12 changes: 12 additions & 0 deletions spec/parser/call_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,3 +117,15 @@
end
end
end

describe "Calls with operators as method names" do
operators = %w[+ - * / & ** | ^ & <=> > >= < <= << >>]

it "should correctly parse the operator as method name after '.'" do
operators.each do |op|
opal_parse("self.#{op}").should == [:call, [:self], op.to_sym, [:arglist]]
opal_parse("self.#{op}(1)").should == [:call, [:self], op.to_sym, [:arglist, [:int, 1]]]
opal_parse("self.#{op}(1, 2)").should == [:call, [:self], op.to_sym, [:arglist, [:int, 1], [:int, 2]]]
end
end
end

0 comments on commit 92bb9b2

Please sign in to comment.