Project

General

Profile

Actions

Bug #17013

closed

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

Added by osyo (manga osyo) almost 2 years ago. Updated about 1 year ago.

Status:
Closed
Priority:
Normal
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 #1

Updated by nobu (Nobuyoshi Nakada) almost 2 years ago

  • Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: DONTNEED, 2.6: REQUIRED, 2.7: REQUIRED
  • Status changed from Open to Closed

Updated by nagachika (Tomoyuki Chikanaga) almost 2 years ago

  • Backport changed from 2.5: DONTNEED, 2.6: REQUIRED, 2.7: REQUIRED to 2.5: DONTNEED, 2.6: REQUIRED, 2.7: DONE

ruby_2_7 e9e4f8430a62f56a4e62dd728f4498ee4c300c12 merged revision(s) 8e189df32cacef4b21e357a590d349330532baf5.

Updated by usa (Usaku NAKAMURA) about 1 year ago

  • Backport changed from 2.5: DONTNEED, 2.6: REQUIRED, 2.7: DONE to 2.5: DONTNEED, 2.6: DONE, 2.7: DONE

backported into ruby_2_6 at r67921

Actions

Also available in: Atom PDF