From: manga.osyo@... Date: 2020-07-05T13:30:25+00:00 Subject: [ruby-core:99069] [Ruby master Bug#17013] `RubyVM::AbstractSyntaxTree.parse("struct.field += foo")` has no operator Issue #17013 has been reported by osyo (manga osyo). ---------------------------------------- Bug #17013: `RubyVM::AbstractSyntaxTree.parse("struct.field += foo")` has no operator https://bugs.ruby-lang.org/issues/17013 * Author: osyo (manga osyo) * Status: Open * Priority: Normal * ruby -v: ruby 2.8.0dev (2020-07-05T10:15:03Z master 4ea57c2a39) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- ## Summary `RubyVM::AbstractSyntaxTree.parse("struct.field += foo")` has no operator. I'm making a tool that uses AST, but I'm having trouble finding a way to distinguish `struct.field += foo` and `struct.field -= foo` because of this. ## Expected behavior ```ruby node = RubyVM::AbstractSyntaxTree.parse("struct.field += foo") body = node.children.last # have operator (:+) pp body.type # => :OP_ASGN2 pp body.children # => [(VCALL@1:0-1:6 :struct), false, :field, :+, (VCALL@1:16-1:19 :foo)] ``` ## Actual behavior ```ruby node = RubyVM::AbstractSyntaxTree.parse("struct.field += foo") body = node.children.last # have not operator (:+) pp body.type # => :OP_ASGN2 pp body.children # => [(VCALL@1:0-1:6 :struct), false, :field, (VCALL@1:16-1:19 :foo)] ``` Also, `OP_ASGN1` and `LASGN` have operator (`:+`). ``` node = RubyVM::AbstractSyntaxTree.parse("ary[0] += foo") body = node.children.last pp body.type # => :OP_ASGN1 pp body.children # => [(VCALL@1:0-1:3 :ary), :+, (LIST@1:4-1:5 (LIT@1:4-1:5 0) nil), (VCALL@1:10-1:13 :foo)] node = RubyVM::AbstractSyntaxTree.parse("ary += foo") body = node.children.last pp body.type # => :LASGN pp body.children # => [:ary, (CALL@1:0-1:10 (LVAR@1:0-1:3 :ary) :+ (LIST@1:7-1:10 (VCALL@1:7-1:10 :foo) nil))] ``` ## Versions * `ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]` * `ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]` * `ruby 2.8.0dev (2020-07-05T10:15:03Z master 4ea57c2a39) [x86_64-linux]` ## Patch * PR : https://github.com/ruby/ruby/pull/3294 * Operator position is aligned with `struct.field + = foo` * Operator positions can be changed if desired -- https://bugs.ruby-lang.org/ Unsubscribe: