class RubySimpleParser::Parser

Attributes

class_definition[R]
class_method_calls[RW]

Public Class Methods

new(code = '') click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 14
def initialize(code = '')
  @code = code
  @line_classifier = LineClassifier.new
  parse if code
end

Public Instance Methods

class_method_calls_after(method) click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 82
def class_method_calls_after(method)
  if @class_method_calls.has_key? method
    @class_method_calls[method]
  else
    []
  end
end
parse() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 28
def parse
  prepare_to_parse

  @code_lines.each_index do |line_number|
    line_code = @code_lines[line_number]
    line_class = @line_classifier.classify line_code
    new_block = nil

    if line_class == CLASS_START
      new_block = RubySimpleParser::ClassDefinition.new line_code, @context
      @context = new_block
      @class_definition = new_block
      # puts "Entered context: #{@context.name}"

    elsif line_class == CODE_WITH_BLOCK
      new_block = RubySimpleParser::Block.new line_code, @context
      @context = new_block

    elsif line_class == METHOD_START
      new_block = RubySimpleParser::Method.new line_code, @method_scope, @context
      @context = new_block
      @methods[@method_scope][new_block.name] = new_block
      @last_method = new_block.name
      # puts "Entered context: #{@context.name}"

    elsif line_class == PRIVATE_BLOCK
      @method_scope = :private
      RubySimpleParser::CodeLine.new line_code, @context

    else
      new_block = RubySimpleParser::CodeLine.new line_code, @context

      if line_class == BLOCK_END
        if @context.parent
          # puts "Left context: #{@context.name} (line_class: #{line_class})"
          @context = @context.parent
        end
      end
    end

    if new_block and (![EMPTY, BLOCK_END].include? line_class) and !new_block.is_a? ClassDefinition and
      (( line_class == CODE_WITH_BLOCK and @context.parent.is_a? ClassDefinition ) or
       @context.is_a? ClassDefinition )

      if @last_method
        @class_method_calls[@last_method] ||= []
        @class_method_calls[@last_method] << new_block
      else
        @class_method_calls[:after_class_definition] << new_block
      end
    end
  end
end
print() click to toggle source
private_methods() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 24
def private_methods
  @methods[:private]
end
public_methods() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 20
def public_methods
  @methods[:public]
end

Private Instance Methods

prepare_to_parse() click to toggle source
# File lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb, line 95
def prepare_to_parse
  @code_lines = @code.split("\n")
  @parsed_code = {}
  @global_context = GlobalContext.new
  @context = @global_context

  @methods = {
    public: {},
    private: {}
  }

  @last_method = nil

  @class_method_calls = { after_class_definition: [] }
  @class_definition = nil

  @method_scope = :public
end