Skip to content

Instantly share code, notes, and snippets.

@hashrocketeer
Created August 5, 2013 20:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hashrocketeer/6159226 to your computer and use it in GitHub Desktop.
Save hashrocketeer/6159226 to your computer and use it in GitHub Desktop.
require 'method_source'
module ChristmasTree
class WrappingPaper
class ExpressionParser
attr_reader :block
ExpressionOptions = Struct.new(:expression, :line_number) do
def range
line_number..(expression.split("\n").length + line_number)
end
end
def initialize(options)
@block = options.fetch(:block)
@expression_counter = 0
end
def expression_counter
@expression_counter ||= 0
end
def accumulator
@accumulator ||= {}
end
def length
@length ||= block.source.split("\n").length
end
def location
block.source_location[0]
end
def starting_line
block.source_location[1]
end
def extract_expression_from(line_number)
expression = MethodSource.expression_at(File.read(location),line_number).strip
self.accumulator[expression_counter] = ExpressionOptions.new(expression, line_number)
@expression_counter += 1
rescue SyntaxError
true
end
def collect_expression
(source_range).each do |line_number|
extract_expression_from(line_number)
end
accumulator
end
def source_range
starting_line..(starting_line + length)
end
def self.expression_from_block(block)
new(block: block).collect_expression
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment