byebug 5.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -1
  3. data/CONTRIBUTING.md +35 -13
  4. data/GUIDE.md +256 -198
  5. data/README.md +5 -11
  6. data/ext/byebug/byebug.c +5 -43
  7. data/ext/byebug/byebug.h +6 -1
  8. data/ext/byebug/context.c +4 -5
  9. data/lib/byebug/command.rb +64 -64
  10. data/lib/byebug/command_list.rb +32 -0
  11. data/lib/byebug/commands.rb +37 -0
  12. data/lib/byebug/commands/break.rb +45 -37
  13. data/lib/byebug/commands/catch.rb +52 -28
  14. data/lib/byebug/commands/condition.rb +19 -13
  15. data/lib/byebug/commands/continue.rb +15 -11
  16. data/lib/byebug/commands/delete.rb +18 -12
  17. data/lib/byebug/commands/disable.rb +9 -10
  18. data/lib/byebug/commands/disable/breakpoints.rb +13 -11
  19. data/lib/byebug/commands/disable/display.rb +13 -11
  20. data/lib/byebug/commands/display.rb +32 -24
  21. data/lib/byebug/commands/down.rb +18 -14
  22. data/lib/byebug/commands/edit.rb +42 -26
  23. data/lib/byebug/commands/enable.rb +9 -3
  24. data/lib/byebug/commands/enable/breakpoints.rb +13 -11
  25. data/lib/byebug/commands/enable/display.rb +13 -11
  26. data/lib/byebug/commands/finish.rb +23 -14
  27. data/lib/byebug/commands/frame.rb +21 -18
  28. data/lib/byebug/commands/help.rb +39 -16
  29. data/lib/byebug/commands/history.rb +16 -10
  30. data/lib/byebug/commands/info.rb +8 -5
  31. data/lib/byebug/commands/info/breakpoints.rb +16 -14
  32. data/lib/byebug/commands/info/display.rb +18 -18
  33. data/lib/byebug/commands/info/file.rb +22 -22
  34. data/lib/byebug/commands/info/line.rb +13 -11
  35. data/lib/byebug/commands/info/program.rb +13 -17
  36. data/lib/byebug/commands/interrupt.rb +13 -11
  37. data/lib/byebug/commands/irb.rb +16 -10
  38. data/lib/byebug/commands/kill.rb +19 -13
  39. data/lib/byebug/commands/list.rb +35 -24
  40. data/lib/byebug/commands/method.rb +25 -15
  41. data/lib/byebug/commands/next.rb +15 -13
  42. data/lib/byebug/commands/pry.rb +18 -11
  43. data/lib/byebug/commands/ps.rb +21 -23
  44. data/lib/byebug/commands/quit.rb +17 -11
  45. data/lib/byebug/commands/restart.rb +28 -24
  46. data/lib/byebug/commands/save.rb +23 -15
  47. data/lib/byebug/commands/set.rb +26 -19
  48. data/lib/byebug/commands/show.rb +20 -14
  49. data/lib/byebug/commands/source.rb +15 -14
  50. data/lib/byebug/commands/step.rb +15 -13
  51. data/lib/byebug/commands/thread.rb +8 -4
  52. data/lib/byebug/commands/thread/current.rb +11 -11
  53. data/lib/byebug/commands/thread/list.rb +14 -14
  54. data/lib/byebug/commands/thread/resume.rb +14 -14
  55. data/lib/byebug/commands/thread/stop.rb +14 -14
  56. data/lib/byebug/commands/thread/switch.rb +15 -14
  57. data/lib/byebug/commands/tracevar.rb +20 -16
  58. data/lib/byebug/commands/undisplay.rb +22 -18
  59. data/lib/byebug/commands/untracevar.rb +13 -11
  60. data/lib/byebug/commands/up.rb +18 -14
  61. data/lib/byebug/commands/var.rb +10 -3
  62. data/lib/byebug/commands/var/all.rb +15 -13
  63. data/lib/byebug/commands/var/args.rb +37 -0
  64. data/lib/byebug/commands/var/const.rb +25 -14
  65. data/lib/byebug/commands/var/global.rb +13 -11
  66. data/lib/byebug/commands/var/instance.rb +13 -11
  67. data/lib/byebug/commands/var/local.rb +13 -11
  68. data/lib/byebug/commands/where.rb +15 -11
  69. data/lib/byebug/context.rb +71 -73
  70. data/lib/byebug/core.rb +45 -26
  71. data/lib/byebug/errors.rb +27 -0
  72. data/lib/byebug/frame.rb +181 -0
  73. data/lib/byebug/helpers/eval.rb +67 -26
  74. data/lib/byebug/helpers/file.rb +18 -3
  75. data/lib/byebug/helpers/frame.rb +36 -39
  76. data/lib/byebug/helpers/parse.rb +15 -13
  77. data/lib/byebug/helpers/path.rb +21 -0
  78. data/lib/byebug/helpers/reflection.rb +17 -0
  79. data/lib/byebug/helpers/thread.rb +20 -14
  80. data/lib/byebug/helpers/toggle.rb +10 -5
  81. data/lib/byebug/helpers/var.rb +36 -15
  82. data/lib/byebug/interface.rb +27 -9
  83. data/lib/byebug/option_setter.rb +93 -0
  84. data/lib/byebug/printers/base.rb +3 -0
  85. data/lib/byebug/printers/plain.rb +4 -14
  86. data/lib/byebug/printers/texts/base.yml +2 -7
  87. data/lib/byebug/processors/command_processor.rb +101 -102
  88. data/lib/byebug/processors/control_processor.rb +20 -0
  89. data/lib/byebug/processors/post_mortem_processor.rb +16 -0
  90. data/lib/byebug/processors/script_processor.rb +49 -0
  91. data/lib/byebug/remote.rb +13 -7
  92. data/lib/byebug/runner.rb +39 -65
  93. data/lib/byebug/setting.rb +4 -1
  94. data/lib/byebug/settings/post_mortem.rb +0 -16
  95. data/lib/byebug/settings/savefile.rb +1 -4
  96. data/lib/byebug/subcommands.rb +27 -29
  97. data/lib/byebug/version.rb +4 -1
  98. metadata +14 -29
  99. data/lib/byebug/commands/eval.rb +0 -43
  100. data/lib/byebug/commands/info/args.rb +0 -39
  101. data/lib/byebug/commands/info/catch.rb +0 -39
  102. data/lib/byebug/commands/pp.rb +0 -41
  103. data/lib/byebug/commands/putl.rb +0 -43
  104. data/lib/byebug/processor.rb +0 -43
  105. data/lib/byebug/processors/control_command_processor.rb +0 -48
  106. data/lib/byebug/settings/verbose.rb +0 -20
  107. data/lib/byebug/state.rb +0 -12
  108. data/lib/byebug/states/control_state.rb +0 -26
  109. data/lib/byebug/states/regular_state.rb +0 -187
  110. data/lib/byebug/subcommand_list.rb +0 -33
@@ -8,28 +8,30 @@ module Byebug
8
8
  #
9
9
  # Shows local variables in current scope
10
10
  #
11
- class LocalSubcommand < Command
11
+ class LocalCommand < Command
12
12
  include Helpers::VarHelper
13
13
 
14
- def regexp
15
- /^\s* l(?:ocal)? \s*$/x
16
- end
17
-
18
- def execute
19
- var_local
20
- end
14
+ self.allow_in_post_mortem = true
21
15
 
22
- def short_description
23
- 'Shows local variables in current scope.'
16
+ def self.regexp
17
+ /^\s* l(?:ocal)? \s*$/x
24
18
  end
25
19
 
26
- def description
20
+ def self.description
27
21
  <<-EOD
28
22
  v[ar] l[ocal]
29
23
 
30
24
  #{short_description}
31
25
  EOD
32
26
  end
27
+
28
+ def self.short_description
29
+ 'Shows local variables in current scope.'
30
+ end
31
+
32
+ def execute
33
+ var_local
34
+ end
33
35
  end
34
36
  end
35
37
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'pathname'
4
2
  require 'byebug/command'
5
3
  require 'byebug/helpers/frame'
@@ -11,19 +9,17 @@ module Byebug
11
9
  class WhereCommand < Command
12
10
  include Helpers::FrameHelper
13
11
 
14
- def regexp
15
- /^\s* (?:w(?:here)?|bt|backtrace) \s*$/x
16
- end
12
+ self.allow_in_post_mortem = true
17
13
 
18
- def execute
19
- print_backtrace
14
+ def self.regexp
15
+ /^\s* (?:w(?:here)?|bt|backtrace) \s*$/x
20
16
  end
21
17
 
22
- def description
18
+ def self.description
23
19
  <<-EOD
24
20
  w[here]|bt|backtrace
25
21
 
26
- Display stack frames.
22
+ #{short_description}
27
23
 
28
24
  Print the entire stack frame. Each frame is numbered; the most recent
29
25
  frame is 0. A frame number can be referred to in the "frame" command.
@@ -34,11 +30,19 @@ module Byebug
34
30
  EOD
35
31
  end
36
32
 
33
+ def self.short_description
34
+ 'Displays the backtrace'
35
+ end
36
+
37
+ def execute
38
+ print_backtrace
39
+ end
40
+
37
41
  private
38
42
 
39
43
  def print_backtrace
40
- bt = prc('frame.line', (0...@state.context.stack_size)) do |_, index|
41
- get_pr_arguments(index)
44
+ bt = prc('frame.line', (0...context.stack_size)) do |_, index|
45
+ Frame.new(context, index).to_hash
42
46
  end
43
47
 
44
48
  print(bt)
@@ -1,3 +1,8 @@
1
+ require 'byebug/frame'
2
+ require 'byebug/helpers/path'
3
+ require 'byebug/helpers/file'
4
+ require 'byebug/processors/command_processor'
5
+
1
6
  module Byebug
2
7
  #
3
8
  # Mantains context information for the debugger and it's the main
@@ -5,19 +10,32 @@ module Byebug
5
10
  # at_breakpoint, at_catchpoint, at_tracing, at_line and at_return callbacks
6
11
  #
7
12
  class Context
8
- #
9
- # List of files byebug will ignore while debugging
10
- #
11
- def self.ignored_files
12
- Byebug.mode == :standalone ? lib_files + [bin_file] : lib_files
13
- end
13
+ include Helpers::FileHelper
14
14
 
15
- def self.bin_file
16
- @bin_file ||= Gem.bin_path('byebug', 'byebug')
17
- end
15
+ class << self
16
+ include Helpers::PathHelper
17
+
18
+ attr_writer :ignored_files
18
19
 
19
- def self.lib_files
20
- @lib_files ||= Dir.glob(File.expand_path('../../**/*.rb', __FILE__))
20
+ #
21
+ # List of files byebug will ignore while debugging
22
+ #
23
+ def ignored_files
24
+ @ignored_files ||=
25
+ Byebug.mode == :standalone ? lib_files + [bin_file] : lib_files
26
+ end
27
+
28
+ attr_writer :interface
29
+
30
+ def interface
31
+ @interface ||= LocalInterface.new
32
+ end
33
+
34
+ attr_writer :processor
35
+
36
+ def processor
37
+ @processor ||= CommandProcessor
38
+ end
21
39
  end
22
40
 
23
41
  #
@@ -29,6 +47,32 @@ module Byebug
29
47
  self.class.ignored_files.include?(path)
30
48
  end
31
49
 
50
+ def frame
51
+ @frame ||= Frame.new(self, 0)
52
+ end
53
+
54
+ def frame=(pos)
55
+ @frame = Frame.new(self, pos)
56
+ end
57
+
58
+ def file
59
+ frame.file
60
+ end
61
+
62
+ def line
63
+ frame.line
64
+ end
65
+
66
+ def location
67
+ "#{normalize(file)}:#{line}"
68
+ end
69
+
70
+ def full_location
71
+ return location if virtual_file?(file)
72
+
73
+ "#{location} #{get_line(file, line)}"
74
+ end
75
+
32
76
  #
33
77
  # Context's stack size
34
78
  #
@@ -44,83 +88,37 @@ module Byebug
44
88
  step_into 1
45
89
  end
46
90
 
47
- #
48
- # Gets local variables for a frame.
49
- #
50
- # @param frame_no Frame index in the backtrace. Defaults to 0.
51
- #
52
- # TODO: Use brand new local_variable_{get,set,defined?} for rubies >= 2.1
53
- #
54
- def frame_locals(frame_no = 0)
55
- bind = frame_binding(frame_no)
56
- return [] unless bind
57
-
58
- bind.eval('local_variables.inject({}){|h, v| h[v] = eval(v.to_s); h}')
91
+ def at_breakpoint(breakpoint)
92
+ new_processor.at_breakpoint(breakpoint)
59
93
  end
60
94
 
61
- #
62
- # Gets current method arguments for a frame.
63
- #
64
- # @param frame_no Frame index in the backtrace. Defaults to 0.
65
- #
66
- def frame_args(frame_no = 0)
67
- bind = frame_binding(frame_no)
68
- return c_frame_args(frame_no) unless bind
69
-
70
- ruby_frame_args(bind)
95
+ def at_catchpoint(exception)
96
+ new_processor.at_catchpoint(exception)
71
97
  end
72
98
 
73
- def handler
74
- Byebug.handler || fail('No interface loaded')
75
- end
99
+ def at_tracing(file, _line)
100
+ return if ignored_file?(file)
76
101
 
77
- def at_breakpoint(brkpnt)
78
- handler.at_breakpoint(self, brkpnt)
102
+ new_processor.at_tracing
79
103
  end
80
104
 
81
- def at_catchpoint(excpt)
82
- handler.at_catchpoint(self, excpt)
83
- end
105
+ def at_line(file, _l)
106
+ self.frame = 0
107
+ return if ignored_file?(file)
84
108
 
85
- def at_tracing(file, line)
86
- handler.at_tracing(self, file, line) unless ignored_file?(file)
109
+ new_processor.at_line
87
110
  end
88
111
 
89
- def at_line(file, line)
90
- handler.at_line(self, file, line) unless ignored_file?(file)
91
- end
112
+ def at_return(file, _line)
113
+ return if ignored_file?(file)
92
114
 
93
- def at_return(file, line)
94
- handler.at_return(self, file, line) unless ignored_file?(file)
115
+ new_processor.at_return
95
116
  end
96
117
 
97
118
  private
98
119
 
99
- #
100
- # Gets method arguments for a c-frame.
101
- #
102
- # @param frame_no Frame index in the backtrace.
103
- #
104
- def c_frame_args(frame_no)
105
- myself = frame_self(frame_no)
106
- return [] unless myself.to_s != 'main'
107
-
108
- myself.method(frame_method(frame_no)).parameters
109
- end
110
-
111
- #
112
- # Gets method arguments for a ruby-frame.
113
- #
114
- # @param bind Binding for the ruby-frame.
115
- #
116
- def ruby_frame_args(bind)
117
- return [] unless bind.eval('__method__')
118
-
119
- bind.eval('method(__method__).parameters')
120
- rescue NameError => e
121
- Byebug.errmsg \
122
- "Exception #{e.class} (#{e.message}) while retreving frame params"
123
- []
120
+ def new_processor
121
+ @processor ||= self.class.processor.new(self)
124
122
  end
125
123
  end
126
124
  end
@@ -1,34 +1,33 @@
1
+ require 'byebug/helpers/reflection'
1
2
  require 'byebug/byebug'
2
- require 'byebug/version'
3
3
  require 'byebug/context'
4
4
  require 'byebug/breakpoint'
5
5
  require 'byebug/interface'
6
- require 'byebug/processor'
6
+ require 'byebug/processors/script_processor'
7
+ require 'byebug/processors/post_mortem_processor'
8
+ require 'byebug/commands'
7
9
  require 'byebug/remote'
8
10
  require 'byebug/printers/plain'
9
11
 
12
+ #
13
+ # Main debugger's container module. Everything is defined under this module
14
+ #
10
15
  module Byebug
16
+ include Helpers::ReflectionHelper
17
+
11
18
  extend self
12
19
 
13
20
  #
14
21
  # Configuration file used for startup commands. Default value is .byebugrc
15
22
  #
16
- INIT_FILE = '.byebugrc' unless defined?(INIT_FILE)
17
-
18
- #
19
- # Main debugger's processor
20
- #
21
- attr_accessor :handler
22
- self.handler = CommandProcessor.new
23
-
24
- extend Forwardable
25
- def_delegators :handler, :errmsg, :puts
23
+ attr_accessor :init_file
24
+ self.init_file = '.byebugrc'
26
25
 
27
26
  #
28
- # Main debugger's printer
27
+ # Debugger's display expressions
29
28
  #
30
- attr_accessor :printer
31
- self.printer = Printers::Plain.new
29
+ attr_accessor :displays
30
+ self.displays = []
32
31
 
33
32
  #
34
33
  # Running mode of the debugger. Can be either:
@@ -48,39 +47,59 @@ module Byebug
48
47
  # are debugging, in the directory where you invoke byebug.
49
48
  #
50
49
  def run_init_script
51
- home_rc = File.expand_path(File.join(ENV['HOME'].to_s, INIT_FILE))
50
+ home_rc = File.expand_path(File.join(ENV['HOME'].to_s, init_file))
52
51
  run_script(home_rc) if File.exist?(home_rc)
53
52
 
54
- cwd_rc = File.expand_path(File.join('.', INIT_FILE))
53
+ cwd_rc = File.expand_path(File.join('.', init_file))
55
54
  run_script(cwd_rc) if File.exist?(cwd_rc) && cwd_rc != home_rc
56
55
  end
57
56
 
57
+ def self.load_settings
58
+ Dir.glob(File.expand_path('../settings/*.rb', __FILE__)).each do |file|
59
+ require file
60
+ end
61
+
62
+ constants.grep(/[a-z]Setting/).map do |name|
63
+ setting = const_get(name).new
64
+ Byebug::Setting.settings[setting.to_sym] = setting
65
+ end
66
+ end
67
+
58
68
  #
59
- # A Byebug command is a class defined right under the Byebug module and
60
- # named <something>Command
69
+ # Saves information about the unhandled exception and gives a byebug
70
+ # prompt back to the user before program termination.
61
71
  #
62
- def commands
63
- const_list = constants.map { |const| const_get(const, false) }
72
+ def self.handle_post_mortem
73
+ return unless raised_exception
74
+
75
+ context = raised_exception.__bb_context
64
76
 
65
- const_list.select { |c| c.is_a?(Class) && c.name =~ /[a-z]Command$/ }
77
+ PostMortemProcessor.new(context).at_line
66
78
  end
67
79
 
80
+ at_exit { Byebug.handle_post_mortem if Byebug.post_mortem? }
81
+
68
82
  private
69
83
 
70
84
  #
71
85
  # Runs a script file
72
86
  #
73
87
  def run_script(file, verbose = false)
74
- interface = ScriptInterface.new(file, verbose)
75
- processor = ControlCommandProcessor.new(interface)
76
- processor.process_commands
88
+ old_interface = Context.interface
89
+ Context.interface = ScriptInterface.new(file, verbose)
90
+
91
+ ScriptProcessor.new(nil).process_commands
92
+ ensure
93
+ Context.interface = old_interface
77
94
  end
78
95
  end
79
96
 
97
+ Byebug.load_settings
98
+
80
99
  #
81
100
  # Extends the extension class to be able to pass information about the
82
101
  # debugging environment from the c-extension to the user.
83
102
  #
84
103
  class Exception
85
- attr_reader :__bb_file, :__bb_line, :__bb_binding, :__bb_context
104
+ attr_reader :__bb_context
86
105
  end
@@ -0,0 +1,27 @@
1
+ module Byebug
2
+ #
3
+ # Custom exception exception to signal "command not found" errors
4
+ #
5
+ class CommandNotFound < NoMethodError
6
+ def initialize(input, parent = nil)
7
+ @input = input
8
+ @parent = parent
9
+
10
+ super("Unknown command '#{name}'. Try '#{help}'")
11
+ end
12
+
13
+ private
14
+
15
+ def name
16
+ build_cmd(@parent, @input)
17
+ end
18
+
19
+ def help
20
+ build_cmd('help', @parent)
21
+ end
22
+
23
+ def build_cmd(*args)
24
+ args.compact.join(' ')
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,181 @@
1
+ # encoding: utf-8
2
+
3
+ require 'byebug/helpers/file'
4
+
5
+ module Byebug
6
+ #
7
+ # Represents a frame in the stack trace
8
+ #
9
+ class Frame
10
+ include Helpers::FileHelper
11
+
12
+ attr_reader :pos
13
+
14
+ def initialize(context, pos)
15
+ @context = context
16
+ @pos = pos
17
+ end
18
+
19
+ def file
20
+ @context.frame_file(pos)
21
+ end
22
+
23
+ def line
24
+ @context.frame_line(pos)
25
+ end
26
+
27
+ def _self
28
+ @context.frame_self(pos)
29
+ end
30
+
31
+ def _binding
32
+ @context.frame_binding(pos)
33
+ end
34
+
35
+ def _class
36
+ @context.frame_class(pos)
37
+ end
38
+
39
+ def _method
40
+ @context.frame_method(pos)
41
+ end
42
+
43
+ def current?
44
+ @context.frame.pos == pos
45
+ end
46
+
47
+ #
48
+ # Gets local variables for the frame.
49
+ #
50
+ # TODO: Use brand new local_variable_{get,set,defined?} for rubies >= 2.1
51
+ #
52
+ def locals
53
+ return [] unless _binding
54
+
55
+ _binding.eval('local_variables.inject({}){|h, v| h[v] = eval(v.to_s); h}')
56
+ end
57
+
58
+ #
59
+ # Gets current method arguments for the frame.
60
+ #
61
+ def args
62
+ return c_args unless _binding
63
+
64
+ ruby_args
65
+ end
66
+
67
+ #
68
+ # Returns the current class in the frame or an empty string if the current
69
+ # +callstyle+ setting is 'short'
70
+ #
71
+ def deco_class
72
+ Setting[:callstyle] == 'short' || _class.to_s.empty? ? '' : "#{_class}."
73
+ end
74
+
75
+ def deco_block
76
+ _method[/(?:block(?: \(\d+ levels\))?|rescue) in /] || ''
77
+ end
78
+
79
+ def deco_method
80
+ _method[/((?:block(?: \(\d+ levels\))?|rescue) in )?(.*)/]
81
+ end
82
+
83
+ #
84
+ # Builds a string containing all available args in the frame number, in a
85
+ # verbose or non verbose way according to the value of the +callstyle+
86
+ # setting
87
+ #
88
+ def deco_args
89
+ return '' if args.empty?
90
+
91
+ my_args = args.map do |arg|
92
+ prefix, default = prefix_and_default(arg[0])
93
+
94
+ kls = use_short_style?(arg) ? '' : "##{locals[arg[1]].class}"
95
+
96
+ "#{prefix}#{arg[1] || default}#{kls}"
97
+ end
98
+
99
+ "(#{my_args.join(', ')})"
100
+ end
101
+
102
+ #
103
+ # Builds a formatted string containing information about current method call
104
+ #
105
+ def deco_call
106
+ deco_block + deco_class + deco_method + deco_args
107
+ end
108
+
109
+ #
110
+ # Formatted filename in frame
111
+ #
112
+ def deco_file
113
+ Setting[:fullpath] ? File.expand_path(file) : shortpath(file)
114
+ end
115
+
116
+ #
117
+ # Properly formatted frame number of frame
118
+ #
119
+ def deco_pos
120
+ format('%-2d', pos)
121
+ end
122
+
123
+ #
124
+ # Formatted mark for the frame.
125
+ #
126
+ # --> marks the current frame
127
+ # ͱ-- marks c-frames
128
+ # marks regular frames
129
+ #
130
+ def mark
131
+ return '-->' if current?
132
+ return ' ͱ--' if c_frame?
133
+
134
+ ' '
135
+ end
136
+
137
+ #
138
+ # Checks whether the frame is a c-frame
139
+ #
140
+ def c_frame?
141
+ _binding.nil?
142
+ end
143
+
144
+ def to_hash
145
+ {
146
+ mark: mark,
147
+ pos: deco_pos,
148
+ call: deco_call,
149
+ file: deco_file,
150
+ line: line,
151
+ full_path: File.expand_path(deco_file)
152
+ }
153
+ end
154
+
155
+ private
156
+
157
+ def c_args
158
+ return [] unless _self.to_s != 'main'
159
+
160
+ _self.method(_method).parameters
161
+ end
162
+
163
+ def ruby_args
164
+ return [] unless _binding.eval('__method__')
165
+ return [] unless _binding.eval('method(__method__)')
166
+
167
+ _binding.eval('method(__method__).parameters')
168
+ end
169
+
170
+ def use_short_style?(arg)
171
+ Setting[:callstyle] == 'short' || arg[1].nil? || locals.empty?
172
+ end
173
+
174
+ def prefix_and_default(arg_type)
175
+ return ['&', 'block'] if arg_type == :block
176
+ return ['*', 'args'] if arg_type == :rest
177
+
178
+ ['', nil]
179
+ end
180
+ end
181
+ end