module Transpec::Util
Constants
- LITERAL_TYPES
- WHITESPACES
Public Instance Methods
beginning_of_line_range(arg)
click to toggle source
# File lib/transpec/util.rb, line 134 def beginning_of_line_range(arg) range = range_from_arg(arg) begin_pos = range.begin_pos - range.column Parser::Source::Range.new(range.source_buffer, begin_pos, begin_pos) end
block_node_taken_by_method(node)
click to toggle source
# File lib/transpec/util.rb, line 69 def block_node_taken_by_method(node) parent_node = node.parent return nil unless parent_node return nil unless parent_node.block_type? return nil unless parent_node.children.first.equal?(node) parent_node end
chainable_source(node)
click to toggle source
# File lib/transpec/util.rb, line 215 def chainable_source(node) fail "Invalid argument #{node}" unless node.send_type? map = node.loc source = map.expression.source return source if map.selector.source.start_with?('[') arg_node = node.children[2] return source unless arg_node left_of_arg_range = map.selector.end.join(arg_node.loc.expression.begin) return source if left_of_arg_range.source.include?('(') if map.selector.source.match(/^\w/) relative_index = left_of_arg_range.begin_pos - map.expression.begin_pos source[relative_index, left_of_arg_range.length] = '(' source << ')' else "(#{source})" end end
const_name(node)
click to toggle source
# File lib/transpec/util.rb, line 30 def const_name(node) return nil if node.nil? || !node.const_type? const_names = [] const_node = node loop do namespace_node, name = *const_node const_names << name break unless namespace_node break unless namespace_node.is_a?(Parser::AST::Node) break if namespace_node.cbase_type? const_node = namespace_node end const_names.reverse.join('::') end
contain_here_document?(node)
click to toggle source
# File lib/transpec/util.rb, line 53 def contain_here_document?(node) node.each_node.any? { |n| here_document?(n) } end
each_backward_chained_node(origin_node, mode = nil) { |origin_node| ... }
click to toggle source
# File lib/transpec/util.rb, line 102 def each_backward_chained_node(origin_node, mode = nil) return to_enum(__method__, origin_node, mode) unless block_given? yield origin_node if mode == :include_origin origin_node.each_ancestor(:send, :block).reduce(origin_node) do |child_node, parent_node| break unless parent_node.children.first.equal?(child_node) if mode == :child_as_second_arg yield parent_node, child_node else yield parent_node end parent_node end nil end
each_forward_chained_node(origin_node, mode = nil) { |origin_node| ... }
click to toggle source
# File lib/transpec/util.rb, line 77 def each_forward_chained_node(origin_node, mode = nil) return to_enum(__method__, origin_node, mode) unless block_given? yield origin_node if mode == :include_origin parent_node = origin_node loop do child_node = parent_node.children.first return if !child_node || !child_node.is_a?(AST::Node) return unless [:send, :block].include?(child_node.type) if mode == :parent_as_second_arg yield child_node, parent_node else yield child_node end parent_node = child_node end nil end
each_line_range(arg) { |range| ... }
click to toggle source
# File lib/transpec/util.rb, line 145 def each_line_range(arg) multiline_range = range_from_arg(arg) range = line_range(multiline_range) while range.line <= multiline_range.end.line yield range range = line_range(range.end) end end
expand_range_to_adjacent_whitespaces(range, direction = :both)
click to toggle source
# File lib/transpec/util.rb, line 178 def expand_range_to_adjacent_whitespaces(range, direction = :both) source = range.source_buffer.source begin_pos = if [:both, :begin].include?(direction) find_consecutive_whitespace_position(source, range.begin_pos, :downto) else range.begin_pos end end_pos = if [:both, :end].include?(direction) find_consecutive_whitespace_position(source, range.end_pos - 1, :upto) + 1 else range.end_pos end Parser::Source::Range.new(range.source_buffer, begin_pos, end_pos) end
find_consecutive_whitespace_position(source, origin, method)
click to toggle source
# File lib/transpec/util.rb, line 195 def find_consecutive_whitespace_position(source, origin, method) from, to = case method when :upto [origin + 1, source.length - 1] when :downto [origin - 1, 0] else fail "Invalid method #{method}" end from.send(method, to).reduce(origin) do |previous_position, position| character = source[position] if WHITESPACES.include?(character) position else return previous_position end end end
first_block_arg_name(block_node)
click to toggle source
# File lib/transpec/util.rb, line 63 def first_block_arg_name(block_node) args_node = block_node.children[1] first_arg_node = args_node.children.first first_arg_node.children.first end
here_document?(node)
click to toggle source
# File lib/transpec/util.rb, line 48 def here_document?(node) return false unless [:str, :dstr].include?(node.type) node.loc.respond_to?(:heredoc_end) end
in_explicit_parentheses?(node)
click to toggle source
# File lib/transpec/util.rb, line 57 def in_explicit_parentheses?(node) return false unless node.begin_type? source = node.loc.expression.source source[0] == '(' && source[-1] == ')' end
indentation_of_line(arg)
click to toggle source
# File lib/transpec/util.rb, line 122 def indentation_of_line(arg) line = case arg when AST::Node then arg.loc.expression.source_line when Parser::Source::Range then arg.source_line when String then arg else fail ArgumentError, "Invalid argument #{arg}" end /^(?<indentation>\s*)\S/ =~ line indentation end
line_range(arg)
click to toggle source
# File lib/transpec/util.rb, line 140 def line_range(arg) range = range_from_arg(arg) beginning_of_line_range(range).resize(range.source_line.size + 1) end
literal?(node)
click to toggle source
# File lib/transpec/util.rb, line 163 def literal?(node) case node.type when :array, :irange, :erange node.children.all? { |n| literal?(n) } when :hash node.children.all? do |pair_node| pair_node.children.all? { |n| literal?(n) } end when *LITERAL_TYPES true else false end end
proc_literal?(node)
click to toggle source
# File lib/transpec/util.rb, line 15 def proc_literal?(node) return false unless node.block_type? send_node = node.children.first receiver_node, method_name, = *send_node if receiver_node.nil? || const_name(receiver_node) == 'Kernel' [:lambda, :proc].include?(method_name) elsif const_name(receiver_node) == 'Proc' method_name == :new else false end end
range_from_arg(arg)
click to toggle source
# File lib/transpec/util.rb, line 155 def range_from_arg(arg) case arg when AST::Node then arg.loc.expression when Parser::Source::Range then arg else fail ArgumentError, "Invalid argument #{arg}" end end