123456789_123456789_123456789_123456789_123456789_

Class: RDoc::Parser::RubyColorizer::NodeColorizeVisitor

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Prism::Visitor
Instance Chain:
self, Prism::Visitor
Inherits: Prism::Visitor
  • Object
Defined in: lib/rdoc/parser/ruby_colorizer.rb

Overview

Visitor to determine node colorizing which can't be determined by tokens. STRING_CONTENT/EMBEXPR_BEGIN/EMBEXPR_END in string/regexp/symbol have different colorizing

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.newNodeColorizeVisitor

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 138

def initialize
  @tokens = []
end

Instance Attribute Details

#tokens (readonly)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 136

attr_reader :tokens

Instance Method Details

#handle_interpolated_parts(kind, parts) (private)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 228

def handle_interpolated_parts(kind, parts)
  # StringNode, EmbeddedStatementsNode brackets, and EmbeddedVariableNode hash in
  # interpolated regexp/symbol/string parts should be colored as regexp/symbol/string respectively.
  parts.each do |part|
    case part
    when Prism::StringNode
      # InterpolatedStringNode#parts may have its own opening/closing. e.g., `'a' "b"`
      push_location(kind, part.opening_loc)
      push_location(kind, part.content_loc)
      push_location(kind, part.closing_loc)
    when Prism::InterpolatedStringNode
      # InterpolatedStringNode#parts may contain InterpolatedStringNode. e.g., `'a' "#{}"`
      part.accept(self)
    when Prism::EmbeddedStatementsNode
      push_location(kind, part.opening_loc)
      push_location(kind, part.closing_loc)
      part.accept(self)
    when Prism::EmbeddedVariableNode
      push_location(kind, part.operator_loc)
    end
  end
end

#push_location(kind, location) (private)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 221

def push_location(kind, location)
  # Only push tokens that have a non-zero length
  if location && location.start_offset < location.end_offset
    @tokens << [kind, location.start_offset, location.end_offset]
  end
end

#visit_array_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 199

def visit_array_node(node)
  super
  # Colorize %w[...] array literal like string literals, and %i[...] like symbol literals
  case node.opening
  when /\A%[wW].\z/
    push_location(:string, node.opening_loc)
    push_location(:string, node.closing_loc)
  when /\A%[iI].\z/
    push_location(:symbol, node.opening_loc)
    push_location(:symbol, node.closing_loc)
  end
end

#visit_def_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 212

def visit_def_node(node)
  # For special colorizing of method name in def node
  # e.g., `def <=>; end`
  push_location(:identifier, node.name_loc)
  super
end

#visit_interpolated_match_last_line_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 168

alias visit_interpolated_match_last_line_node visit_interpolated_regular_expression_node

#visit_interpolated_regular_expression_node(node) Also known as: #visit_interpolated_match_last_line_node

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 161

def visit_interpolated_regular_expression_node(node)
  push_location(:regexp, node.opening_loc)
  handle_interpolated_parts(:regexp, node.parts)
  push_location(:regexp, node.closing_loc)
end

#visit_interpolated_string_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 179

def visit_interpolated_string_node(node)
  push_location(:string, node.opening_loc)
  handle_interpolated_parts(:string, node.parts)
  push_location(:string, node.closing_loc)
end

#visit_interpolated_symbol_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 151

def visit_interpolated_symbol_node(node)
  push_location(:symbol, node.opening_loc)
  handle_interpolated_parts(:symbol, node.parts)
  push_location(:symbol, node.closing_loc)
end

#visit_interpolated_x_string_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 193

def visit_interpolated_x_string_node(node)
  push_location(:x_string, node.opening_loc)
  handle_interpolated_parts(:x_string, node.parts)
  push_location(:x_string, node.closing_loc)
end

#visit_match_last_line_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 167

alias visit_match_last_line_node visit_regular_expression_node

#visit_regular_expression_node(node) Also known as: #visit_match_last_line_node

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 157

def visit_regular_expression_node(node)
  push_location(:regexp, node.location)
end

#visit_string_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 170

def visit_string_node(node)
  # Node's location may not cover the entire string literal.
  # For example, in a heredoc string, the node's location covers only the heredoc opening.
  # We need to colorize opening, content and closing separately.
  push_location(:string, node.opening_loc)
  push_location(:string, node.content_loc)
  push_location(:string, node.closing_loc)
end

#visit_symbol_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 142

def visit_symbol_node(node)
  # SymbolNode#location may contain heredoc content and closing
  # e.g., `<<A; :\\\nA\nsymbol`
  # So we need to colorize opening, content and closing separately.
  push_location(:symbol, node.opening_loc)
  push_location(:symbol, node.value_loc)
  push_location(:symbol, node.closing_loc)
end

#visit_x_string_node(node)

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 185

def visit_x_string_node(node)
  # Same as visit_string_node, node.location of <<`X` only covers opening,
  # so we need to colorize opening, content and closing separately.
  push_location(:x_string, node.opening_loc)
  push_location(:x_string, node.content_loc)
  push_location(:x_string, node.closing_loc)
end