class Byebug::TracevarCommand


Show (and possibily stop) at every line that changes a global variable.

def description

def description
  prettify <<-EOD
    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.
  EOD
end

def execute

def execute
  var = @match[1]
  return errmsg(pr('trace.errors.needs_global_variable')) unless var
  unless global_variables.include?(:"#{var}")
    return errmsg(pr('trace.errors.var_is_not_global', name: var))
  end
  stop = @match[2] && @match[2] !~ /nostop/
  instance_eval do
    trace_var(:"#{var}") { |val| on_change(var, val, stop) }
  end
  puts pr('trace.messages.success', var: var)
end

def names

def names
  %w(tracevar)
end

def on_change(name, value, stop)

def on_change(name, value, stop)
  puts pr('trace.messages.on_change', name: name, value: value)
  byebug(1, false) if stop
end

def regexp

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