Actions
Bug #17013
closed`RubyVM::AbstractSyntaxTree.parse("struct.field += foo")` has no operator
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.8.0dev (2020-07-05T10:15:03Z master 4ea57c2a39) [x86_64-linux]
Backport:
Description
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¶
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¶
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
Actions
Like0
Like0Like0Like0Like0