Retrieve the comment describing the expression on the given line of the given file.
This is useful to get module or method documentation.
@param [Array<String>, File, String] file The file to parse, either as a File or as
a String or an Array of lines.
@param [Fixnum] line_number The line number at which to look.
NOTE: The first line in a file is line 1!
@return [String] The comment
# File lib/method_source/code_helpers.rb, line 52 def comment_describing(file, line_number) lines = file.is_a?(Array) ? file : file.each_line.to_a extract_last_comment(lines[0..(line_number - 2)]) end
Determine if a string of code is a complete Ruby expression. @param [String] code The code to validate. @return [Boolean] Whether or not the code is a complete Ruby expression. @raise [SyntaxError] Any SyntaxError that does not represent incompleteness. @example
complete_expression?("class Hello") #=> false complete_expression?("class Hello; end") #=> true complete_expression?("class 123") #=> SyntaxError: unexpected tINTEGER
# File lib/method_source/code_helpers.rb, line 66 def complete_expression?(str) old_verbose = $VERBOSE $VERBOSE = nil catch(:valid) do eval("BEGIN{throw :valid}\n#{str}") end # Assert that a line which ends with a , or \ is incomplete. str !~ %r[,\\]\s*\z/ rescue IncompleteExpression false ensure $VERBOSE = old_verbose end
Retrieve the first expression starting on the given line of the given file.
This is useful to get module or method source code.
@param [Array<String>, File, String] file The file to parse, either as a File or as @param [Fixnum] line_number The line number at which to look.
NOTE: The first line in a file is line 1!
@param [Hash] options The optional configuration parameters. @option options [Boolean] :strict If set to true, then only completely
valid expressions are returned. Otherwise heuristics are used to extract expressions that may have been valid inside an eval.
@option options [Fixnum] :consume A number of lines to automatically
consume (add to the expression buffer) without checking for validity.
@return [String] The first complete expression @raise [SyntaxError] If the first complete expression can't be identified
# File lib/method_source/code_helpers.rb, line 20 def expression_at(file, line_number, options={}) options = { :strict => false, :consume => 0 }.merge!(options) lines = file.is_a?(Array) ? file : file.each_line.to_a relevant_lines = lines[(line_number - 1)..-1] || [] extract_first_expression(relevant_lines, options[:consume]) rescue SyntaxError => e raise if options[:strict] begin extract_first_expression(relevant_lines) do |code| code.gsub(%r\#\{.*?\}/, "temp") end rescue SyntaxError => e2 raise e end end