Created
August 5, 2013 20:20
-
-
Save hashrocketeer/6159226 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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