From 3e8aa3d1cc532095db88d37006beedc515e54048 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 22 Sep 2023 11:43:12 -0400 Subject: [PATCH] [ruby/yarp] Move node inspector into its own file https://github.com/ruby/yarp/commit/1c843d2f22 --- lib/yarp.rb | 66 +----------------------------------- lib/yarp/node_inspector.rb | 68 ++++++++++++++++++++++++++++++++++++++ lib/yarp/yarp.gemspec | 1 + 3 files changed, 70 insertions(+), 65 deletions(-) create mode 100644 lib/yarp/node_inspector.rb diff --git a/lib/yarp.rb b/lib/yarp.rb index 1eb1f12d68..3ede97f957 100644 --- a/lib/yarp.rb +++ b/lib/yarp.rb @@ -293,71 +293,6 @@ module YARP end end - # This object is responsible for generating the output for the inspect method - # implementations of child nodes. - class NodeInspector - attr_reader :prefix, :output - - def initialize(prefix = "") - @prefix = prefix - @output = +"" - end - - # Appends a line to the output with the current prefix. - def <<(line) - output << "#{prefix}#{line}" - end - - # This generates a string that is used as the header of the inspect output - # for any given node. - def header(node) - output = +"@ #{node.class.name.split("::").last} (" - output << "location: (#{node.location.start_line},#{node.location.start_column})-(#{node.location.end_line},#{node.location.end_column})" - output << ", newline: true" if node.newline? - output << ")\n" - output - end - - # Generates a string that represents a list of nodes. It handles properly - # using the box drawing characters to make the output look nice. - def list(prefix, nodes) - output = +"(length: #{nodes.length})\n" - last_index = nodes.length - 1 - - nodes.each_with_index do |node, index| - pointer, preadd = (index == last_index) ? ["└── ", " "] : ["├── ", "│ "] - node_prefix = "#{prefix}#{preadd}" - output << node.inspect(NodeInspector.new(node_prefix)).sub(node_prefix, "#{prefix}#{pointer}") - end - - output - end - - # Generates a string that represents a location field on a node. - def location(value) - if value - "(#{value.start_line},#{value.start_column})-(#{value.end_line},#{value.end_column}) = #{value.slice.inspect}" - else - "∅" - end - end - - # Generates a string that represents a child node. - def child_node(node, append) - node.inspect(child_inspector(append)).delete_prefix(prefix) - end - - # Returns a new inspector that can be used to inspect a child node. - def child_inspector(append) - NodeInspector.new("#{prefix}#{append}") - end - - # Returns the output as a string. - def to_str - output - end - end - # There are many files in YARP that are templated to handle every node type, # which means the files can end up being quite large. We autoload them to make # our require speed faster since consuming libraries are unlikely to use all @@ -369,6 +304,7 @@ module YARP autoload :Dispatcher, "yarp/dispatcher" autoload :DSL, "yarp/dsl" autoload :MutationCompiler, "yarp/mutation_compiler" + autoload :NodeInspector, "yarp/node_inspector" autoload :RipperCompat, "yarp/ripper_compat" autoload :Pack, "yarp/pack" autoload :Pattern, "yarp/pattern" diff --git a/lib/yarp/node_inspector.rb b/lib/yarp/node_inspector.rb new file mode 100644 index 0000000000..c09840a471 --- /dev/null +++ b/lib/yarp/node_inspector.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module YARP + # This object is responsible for generating the output for the inspect method + # implementations of child nodes. + class NodeInspector + attr_reader :prefix, :output + + def initialize(prefix = "") + @prefix = prefix + @output = +"" + end + + # Appends a line to the output with the current prefix. + def <<(line) + output << "#{prefix}#{line}" + end + + # This generates a string that is used as the header of the inspect output + # for any given node. + def header(node) + output = +"@ #{node.class.name.split("::").last} (" + output << "location: (#{node.location.start_line},#{node.location.start_column})-(#{node.location.end_line},#{node.location.end_column})" + output << ", newline: true" if node.newline? + output << ")\n" + output + end + + # Generates a string that represents a list of nodes. It handles properly + # using the box drawing characters to make the output look nice. + def list(prefix, nodes) + output = +"(length: #{nodes.length})\n" + last_index = nodes.length - 1 + + nodes.each_with_index do |node, index| + pointer, preadd = (index == last_index) ? ["└── ", " "] : ["├── ", "│ "] + node_prefix = "#{prefix}#{preadd}" + output << node.inspect(NodeInspector.new(node_prefix)).sub(node_prefix, "#{prefix}#{pointer}") + end + + output + end + + # Generates a string that represents a location field on a node. + def location(value) + if value + "(#{value.start_line},#{value.start_column})-(#{value.end_line},#{value.end_column}) = #{value.slice.inspect}" + else + "∅" + end + end + + # Generates a string that represents a child node. + def child_node(node, append) + node.inspect(child_inspector(append)).delete_prefix(prefix) + end + + # Returns a new inspector that can be used to inspect a child node. + def child_inspector(append) + NodeInspector.new("#{prefix}#{append}") + end + + # Returns the output as a string. + def to_str + output + end + end +end diff --git a/lib/yarp/yarp.gemspec b/lib/yarp/yarp.gemspec index daa44207f6..fbe610bfb3 100644 --- a/lib/yarp/yarp.gemspec +++ b/lib/yarp/yarp.gemspec @@ -68,6 +68,7 @@ Gem::Specification.new do |spec| "lib/yarp/lex_compat.rb", "lib/yarp/mutation_compiler.rb", "lib/yarp/node.rb", + "lib/yarp/node_inspector.rb", "lib/yarp/pack.rb", "lib/yarp/pattern.rb", "lib/yarp/ripper_compat.rb",