[ruby/yarp] Template out a comment_targets method

a94af7c4c8
This commit is contained in:
Kevin Newton 2023-09-08 14:33:21 -04:00 committed by git
parent 5d73c0f3df
commit c0f162caab
3 changed files with 16 additions and 9 deletions

View file

@ -100,9 +100,7 @@ module YARP
comment_end = comment.location.end_offset
targets = []
node.deconstruct_keys(nil).each do |key, value|
next if key == :location
node.comment_targets.map do |value|
case value
when StatementsNode
targets.concat(value.body.map { |node| NodeTarget.new(node) })
@ -110,8 +108,6 @@ module YARP
targets << NodeTarget.new(value)
when Location
targets << LocationTarget.new(value)
when Array
targets.concat(value.map { |node| NodeTarget.new(node) }) if value.first.is_a?(Node)
end
end
@ -166,6 +162,8 @@ module YARP
end
end
private_constant :Comments
# Attach the list of comments to their respective locations in the tree.
def attach_comments!
Comments.new(self).attach!

View file

@ -17,7 +17,7 @@ module YARP
# Note that the logic in this file should be kept in sync with the Java
# MarkNewlinesVisitor, since that visitor is responsible for marking the
# newlines for JRuby/TruffleRuby.
class MarkNewlinesVisitor < Visitor
class Newlines < Visitor
def initialize(newline_marked)
@newline_marked = newline_marked
end
@ -50,12 +50,11 @@ module YARP
end
end
private_constant :MarkNewlinesVisitor
private_constant :Newlines
# Walk the tree and mark nodes that are on a new line.
def mark_newlines!
newline_marked = Array.new(1 + source.offsets.size, false)
value.accept(MarkNewlinesVisitor.new(newline_marked))
value.accept(Newlines.new(Array.new(1 + source.offsets.size, false)))
end
end
end

View file

@ -48,6 +48,16 @@ module YARP
}.compact.join(", ") %>]
end
# def comment_targets: () -> Array[Node | Location]
def comment_targets
[<%= node.fields.map { |field|
case field
when YARP::NodeField, YARP::LocationField then field.name
when YARP::OptionalNodeField, YARP::NodeListField, YARP::OptionalLocationField then "*#{field.name}"
end
}.compact.join(", ") %>]
end
# def copy: (**params) -> <%= node.name %>
def copy(**params)
<%= node.name %>.new(