class Byebug::TraceCommand


Show information about every line that is executed.

def description

def description
  %(tr[acevar] <variable> [[no]stop]
    Start tracing variable <variable>.
    If "stop" is specified, execution will stop every time the variable
    changes its value. If nothing or "nostop" is specified, execution
    won't stop, changes will just be logged in byebug's output.)
end

def execute

def execute
  var = @match[1]
  if global_variables.include?("$#{var}".to_sym)
    if @match[2] && @match[2] !~ /(:?no)?stop/
      errmsg "expecting \"stop\" or \"nostop\"; got \"#{@match[2]}\""
    else
      dbg_cmd = if @match[2] && @match[2] !~ /nostop/
                  'byebug(1, false)'
                else
                  ''
                end
    end
    eval("trace_var(:\"\$#{var}\") do |val|
            puts \"traced global variable '#{var}' has value '\#{val}'\"
            #{dbg_cmd}
          end")
    puts "Tracing global variable \"#{var}\"."
  else
    errmsg "'#{var}' is not a global variable."
  end
end

def names

def names
  %w(trace)
end

def regexp

def regexp
  /^\s* tr(?:acevar)? (?: \s+ (\S+))?  # (variable-name)?
                      (?: \s+ (\S+))?  # (stop | nostop)?
   \s*$/x
end