class Byebug::BreakCommand

Implements byebug “break” command.

def description

def description
  %{b[reak] file:line [if expr]
    b[reak] class(.|#)method [if expr]
    Set breakpoint to some position, (optionally) if expr == true}
end

def execute

def execute
  return print BreakCommand.help(nil) if BreakCommand.names.include?(@match[0])
  if @match[1]
    line, _, _, expr = @match.captures
  else
    _, file, line, expr = @match.captures
  end
  if expr
    if expr !~ /^\s*if\s+(.+)/
      if file or line
        errmsg "Expecting \"if\" in breakpoint condition; got: #{expr}.\n"
      else
        errmsg "Invalid breakpoint location: #{expr}.\n"
      end
      return
    else
      expr = $1
    end
  end
  brkpt_filename = file
  if file.nil?
    unless @state.context
      errmsg "We are not in a state that has an associated file.\n"
      return
    end
    brkpt_filename = @state.file
    if line.nil?
      # Set breakpoint at current line
      line = @state.line.to_s
    end
  elsif line !~ /^\d+$/
    # See if "line" is a method/function name
    klass = debug_silent_eval(file)
    if klass && klass.kind_of?(Module)
      class_name = klass.name if klass
    else
      errmsg "Unknown class #{file}.\n"
      throw :debug_error
    end
  end
  if line =~ /^\d+$/
    line = line.to_i
    if LineCache.cache(brkpt_filename, Command.settings[:autoreload])
      last_line = LineCache.size(brkpt_filename)
      return errmsg "There are only #{last_line} lines in file " \
                    "#{brkpt_filename}\n" if line > last_line
      return errmsg "Line #{line} is not a stopping point in file " \
                    "#{brkpt_filename}\n" unless
        LineCache.trace_line_numbers(brkpt_filename).member?(line)
    else
      errmsg "No source file named #{brkpt_filename}\n"
      return unless confirm("Set breakpoint anyway? (y/n) ")
    end
    b = Byebug.add_breakpoint brkpt_filename, line, expr
    print "Created breakpoint #{b.id} at " \
          "#{CommandProcessor.canonic_file(brkpt_filename)}:#{line.to_s}\n"
    unless syntax_valid?(expr)
      errmsg "Expression \"#{expr}\" syntactically incorrect; breakpoint" \
             " disabled.\n"
      b.enabled = false
    end
  else
    method = line.intern
    b = Byebug.add_breakpoint class_name, method, expr
    print "Created breakpoint #{b.id} at #{class_name}::#{method.to_s}\n"
  end
end

def names

def names
  %w(break)
end

def regexp

def regexp
  /^\s* b(?:reak)? (?:\s+#{Position_regexp})? (?:\s+(.+))? \s*$/x
end