Project

General

Profile

Actions

Bug #17013

closed

`RubyVM::AbstractSyntaxTree.parse("struct.field += foo")` has no operator

Added by osyo (manga osyo) over 4 years ago. Updated over 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.8.0dev (2020-07-05T10:15:03Z master 4ea57c2a39) [x86_64-linux]
[ruby-core:99069]

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0