irb 1.12.0 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -11
  3. data/Rakefile +10 -0
  4. data/irb.gemspec +1 -1
  5. data/lib/irb/cmd/nop.rb +1 -1
  6. data/lib/irb/color.rb +2 -2
  7. data/lib/irb/command/backtrace.rb +2 -6
  8. data/lib/irb/command/base.rb +7 -9
  9. data/lib/irb/command/break.rb +2 -6
  10. data/lib/irb/command/catch.rb +2 -6
  11. data/lib/irb/command/chws.rb +11 -5
  12. data/lib/irb/command/context.rb +16 -0
  13. data/lib/irb/command/continue.rb +2 -2
  14. data/lib/irb/command/debug.rb +8 -1
  15. data/lib/irb/command/delete.rb +2 -2
  16. data/lib/irb/command/disable_irb.rb +19 -0
  17. data/lib/irb/command/edit.rb +6 -13
  18. data/lib/irb/command/exit.rb +1 -3
  19. data/lib/irb/command/finish.rb +2 -2
  20. data/lib/irb/command/force_exit.rb +1 -3
  21. data/lib/irb/command/help.rb +8 -17
  22. data/lib/irb/command/history.rb +4 -6
  23. data/lib/irb/command/info.rb +2 -6
  24. data/lib/irb/command/internal_helpers.rb +27 -0
  25. data/lib/irb/command/irb_info.rb +2 -2
  26. data/lib/irb/command/load.rb +20 -3
  27. data/lib/irb/command/ls.rb +20 -10
  28. data/lib/irb/command/measure.rb +12 -6
  29. data/lib/irb/command/next.rb +2 -2
  30. data/lib/irb/command/pushws.rb +10 -5
  31. data/lib/irb/command/show_doc.rb +9 -18
  32. data/lib/irb/command/show_source.rb +5 -12
  33. data/lib/irb/command/step.rb +2 -2
  34. data/lib/irb/command/subirb.rb +28 -12
  35. data/lib/irb/command/whereami.rb +1 -1
  36. data/lib/irb/command.rb +8 -303
  37. data/lib/irb/completion.rb +16 -5
  38. data/lib/irb/context.rb +21 -19
  39. data/lib/irb/default_commands.rb +260 -0
  40. data/lib/irb/ext/change-ws.rb +3 -5
  41. data/lib/irb/ext/multi-irb.rb +4 -4
  42. data/lib/irb/ext/workspaces.rb +3 -4
  43. data/lib/irb/help.rb +1 -1
  44. data/lib/irb/helper_method/base.rb +16 -0
  45. data/lib/irb/helper_method/conf.rb +11 -0
  46. data/lib/irb/helper_method.rb +29 -0
  47. data/lib/irb/history.rb +6 -3
  48. data/lib/irb/init.rb +60 -44
  49. data/lib/irb/input-method.rb +18 -10
  50. data/lib/irb/lc/error.rb +0 -5
  51. data/lib/irb/lc/ja/error.rb +0 -5
  52. data/lib/irb/lc/ja/help-message +10 -0
  53. data/lib/irb/statement.rb +5 -27
  54. data/lib/irb/version.rb +2 -2
  55. data/lib/irb/workspace.rb +18 -2
  56. data/lib/irb.rb +675 -624
  57. metadata +12 -5
@@ -14,7 +14,7 @@ module IRB
14
14
  category "Workspace"
15
15
  description "Show workspaces."
16
16
 
17
- def execute(*obj)
17
+ def execute(_arg)
18
18
  inspection_resuls = irb_context.instance_variable_get(:@workspace_stack).map do |ws|
19
19
  truncated_inspect(ws.main)
20
20
  end
@@ -39,8 +39,13 @@ module IRB
39
39
  category "Workspace"
40
40
  description "Push an object to the workspace stack."
41
41
 
42
- def execute(*obj)
43
- irb_context.push_workspace(*obj)
42
+ def execute(arg)
43
+ if arg.empty?
44
+ irb_context.push_workspace
45
+ else
46
+ obj = eval(arg, irb_context.workspace.binding)
47
+ irb_context.push_workspace(obj)
48
+ end
44
49
  super
45
50
  end
46
51
  end
@@ -49,8 +54,8 @@ module IRB
49
54
  category "Workspace"
50
55
  description "Pop a workspace from the workspace stack."
51
56
 
52
- def execute(*obj)
53
- irb_context.pop_workspace(*obj)
57
+ def execute(_arg)
58
+ irb_context.pop_workspace
54
59
  super
55
60
  end
56
61
  end
@@ -3,16 +3,7 @@
3
3
  module IRB
4
4
  module Command
5
5
  class ShowDoc < Base
6
- class << self
7
- def transform_args(args)
8
- # Return a string literal as is for backward compatibility
9
- if args.empty? || string_literal?(args)
10
- args
11
- else # Otherwise, consider the input as a String for convenience
12
- args.strip.dump
13
- end
14
- end
15
- end
6
+ include RubyArgsExtractor
16
7
 
17
8
  category "Context"
18
9
  description "Look up documentation with RI."
@@ -31,7 +22,9 @@ module IRB
31
22
 
32
23
  HELP_MESSAGE
33
24
 
34
- def execute(*names)
25
+ def execute(arg)
26
+ # Accept string literal for backward compatibility
27
+ name = unwrap_string_literal(arg)
35
28
  require 'rdoc/ri/driver'
36
29
 
37
30
  unless ShowDoc.const_defined?(:Ri)
@@ -39,15 +32,13 @@ module IRB
39
32
  ShowDoc.const_set(:Ri, RDoc::RI::Driver.new(opts))
40
33
  end
41
34
 
42
- if names.empty?
35
+ if name.nil?
43
36
  Ri.interactive
44
37
  else
45
- names.each do |name|
46
- begin
47
- Ri.display_name(name.to_s)
48
- rescue RDoc::RI::Error
49
- puts $!.message
50
- end
38
+ begin
39
+ Ri.display_name(name)
40
+ rescue RDoc::RI::Error
41
+ puts $!.message
51
42
  end
52
43
  end
53
44
 
@@ -7,6 +7,8 @@ require_relative "../color"
7
7
  module IRB
8
8
  module Command
9
9
  class ShowSource < Base
10
+ include RubyArgsExtractor
11
+
10
12
  category "Context"
11
13
  description "Show the source code of a given method, class/module, or constant."
12
14
 
@@ -24,18 +26,9 @@ module IRB
24
26
  show_source Foo::BAR
25
27
  HELP_MESSAGE
26
28
 
27
- class << self
28
- def transform_args(args)
29
- # Return a string literal as is for backward compatibility
30
- if args.empty? || string_literal?(args)
31
- args
32
- else # Otherwise, consider the input as a String for convenience
33
- args.strip.dump
34
- end
35
- end
36
- end
37
-
38
- def execute(str = nil)
29
+ def execute(arg)
30
+ # Accept string literal for backward compatibility
31
+ str = unwrap_string_literal(arg)
39
32
  unless str.is_a?(String)
40
33
  puts "Error: Expected a string but got #{str.inspect}"
41
34
  return
@@ -7,8 +7,8 @@ module IRB
7
7
 
8
8
  module Command
9
9
  class Step < DebugCommand
10
- def execute(*args)
11
- super(do_cmds: ["step", *args].join(" "))
10
+ def execute(arg)
11
+ execute_debug_command(do_cmds: "step #{arg}")
12
12
  end
13
13
  end
14
14
  end
@@ -9,9 +9,7 @@ module IRB
9
9
 
10
10
  module Command
11
11
  class MultiIRBCommand < Base
12
- def execute(*args)
13
- extend_irb_context
14
- end
12
+ include RubyArgsExtractor
15
13
 
16
14
  private
17
15
 
@@ -36,7 +34,12 @@ module IRB
36
34
  category "Multi-irb (DEPRECATED)"
37
35
  description "Start a child IRB."
38
36
 
39
- def execute(*obj)
37
+ def execute(arg)
38
+ args, kwargs = ruby_args(arg)
39
+ execute_internal(*args, **kwargs)
40
+ end
41
+
42
+ def execute_internal(*obj)
40
43
  print_deprecated_warning
41
44
 
42
45
  if irb_context.with_debugger
@@ -44,8 +47,9 @@ module IRB
44
47
  return
45
48
  end
46
49
 
47
- super
50
+ extend_irb_context
48
51
  IRB.irb(nil, *obj)
52
+ puts IRB.JobManager.inspect
49
53
  end
50
54
  end
51
55
 
@@ -53,7 +57,7 @@ module IRB
53
57
  category "Multi-irb (DEPRECATED)"
54
58
  description "List of current sessions."
55
59
 
56
- def execute
60
+ def execute(_arg)
57
61
  print_deprecated_warning
58
62
 
59
63
  if irb_context.with_debugger
@@ -61,8 +65,8 @@ module IRB
61
65
  return
62
66
  end
63
67
 
64
- super
65
- IRB.JobManager
68
+ extend_irb_context
69
+ puts IRB.JobManager.inspect
66
70
  end
67
71
  end
68
72
 
@@ -70,7 +74,12 @@ module IRB
70
74
  category "Multi-irb (DEPRECATED)"
71
75
  description "Switches to the session of the given number."
72
76
 
73
- def execute(key = nil)
77
+ def execute(arg)
78
+ args, kwargs = ruby_args(arg)
79
+ execute_internal(*args, **kwargs)
80
+ end
81
+
82
+ def execute_internal(key = nil)
74
83
  print_deprecated_warning
75
84
 
76
85
  if irb_context.with_debugger
@@ -78,10 +87,11 @@ module IRB
78
87
  return
79
88
  end
80
89
 
81
- super
90
+ extend_irb_context
82
91
 
83
92
  raise CommandArgumentError.new("Please specify the id of target IRB job (listed in the `jobs` command).") unless key
84
93
  IRB.JobManager.switch(key)
94
+ puts IRB.JobManager.inspect
85
95
  end
86
96
  end
87
97
 
@@ -89,7 +99,12 @@ module IRB
89
99
  category "Multi-irb (DEPRECATED)"
90
100
  description "Kills the session with the given number."
91
101
 
92
- def execute(*keys)
102
+ def execute(arg)
103
+ args, kwargs = ruby_args(arg)
104
+ execute_internal(*args, **kwargs)
105
+ end
106
+
107
+ def execute_internal(*keys)
93
108
  print_deprecated_warning
94
109
 
95
110
  if irb_context.with_debugger
@@ -97,8 +112,9 @@ module IRB
97
112
  return
98
113
  end
99
114
 
100
- super
115
+ extend_irb_context
101
116
  IRB.JobManager.kill(*keys)
117
+ puts IRB.JobManager.inspect
102
118
  end
103
119
  end
104
120
  end
@@ -8,7 +8,7 @@ module IRB
8
8
  category "Context"
9
9
  description "Show the source code around binding.irb again."
10
10
 
11
- def execute(*)
11
+ def execute(_arg)
12
12
  code = irb_context.workspace.code_around_binding
13
13
  if code
14
14
  puts code
data/lib/irb/command.rb CHANGED
@@ -7,312 +7,17 @@
7
7
  require_relative "command/base"
8
8
 
9
9
  module IRB # :nodoc:
10
- module Command; end
11
- ExtendCommand = Command
10
+ module Command
11
+ @commands = {}
12
12
 
13
- # Installs the default irb extensions command bundle.
14
- module ExtendCommandBundle
15
- EXCB = ExtendCommandBundle # :nodoc:
13
+ class << self
14
+ attr_reader :commands
16
15
 
17
- # See #install_alias_method.
18
- NO_OVERRIDE = 0
19
- # See #install_alias_method.
20
- OVERRIDE_PRIVATE_ONLY = 0x01
21
- # See #install_alias_method.
22
- OVERRIDE_ALL = 0x02
23
-
24
- # Displays current configuration.
25
- #
26
- # Modifying the configuration is achieved by sending a message to IRB.conf.
27
- def irb_context
28
- IRB.CurrentContext
29
- end
30
-
31
- @ALIASES = [
32
- [:context, :irb_context, NO_OVERRIDE],
33
- [:conf, :irb_context, NO_OVERRIDE],
34
- ]
35
-
36
-
37
- @EXTEND_COMMANDS = [
38
- [
39
- :irb_exit, :Exit, "command/exit",
40
- [:exit, OVERRIDE_PRIVATE_ONLY],
41
- [:quit, OVERRIDE_PRIVATE_ONLY],
42
- [:irb_quit, OVERRIDE_PRIVATE_ONLY],
43
- ],
44
- [
45
- :irb_exit!, :ForceExit, "command/force_exit",
46
- [:exit!, OVERRIDE_PRIVATE_ONLY],
47
- ],
48
-
49
- [
50
- :irb_current_working_workspace, :CurrentWorkingWorkspace, "command/chws",
51
- [:cwws, NO_OVERRIDE],
52
- [:pwws, NO_OVERRIDE],
53
- [:irb_print_working_workspace, OVERRIDE_ALL],
54
- [:irb_cwws, OVERRIDE_ALL],
55
- [:irb_pwws, OVERRIDE_ALL],
56
- [:irb_current_working_binding, OVERRIDE_ALL],
57
- [:irb_print_working_binding, OVERRIDE_ALL],
58
- [:irb_cwb, OVERRIDE_ALL],
59
- [:irb_pwb, OVERRIDE_ALL],
60
- ],
61
- [
62
- :irb_change_workspace, :ChangeWorkspace, "command/chws",
63
- [:chws, NO_OVERRIDE],
64
- [:cws, NO_OVERRIDE],
65
- [:irb_chws, OVERRIDE_ALL],
66
- [:irb_cws, OVERRIDE_ALL],
67
- [:irb_change_binding, OVERRIDE_ALL],
68
- [:irb_cb, OVERRIDE_ALL],
69
- [:cb, NO_OVERRIDE],
70
- ],
71
-
72
- [
73
- :irb_workspaces, :Workspaces, "command/pushws",
74
- [:workspaces, NO_OVERRIDE],
75
- [:irb_bindings, OVERRIDE_ALL],
76
- [:bindings, NO_OVERRIDE],
77
- ],
78
- [
79
- :irb_push_workspace, :PushWorkspace, "command/pushws",
80
- [:pushws, NO_OVERRIDE],
81
- [:irb_pushws, OVERRIDE_ALL],
82
- [:irb_push_binding, OVERRIDE_ALL],
83
- [:irb_pushb, OVERRIDE_ALL],
84
- [:pushb, NO_OVERRIDE],
85
- ],
86
- [
87
- :irb_pop_workspace, :PopWorkspace, "command/pushws",
88
- [:popws, NO_OVERRIDE],
89
- [:irb_popws, OVERRIDE_ALL],
90
- [:irb_pop_binding, OVERRIDE_ALL],
91
- [:irb_popb, OVERRIDE_ALL],
92
- [:popb, NO_OVERRIDE],
93
- ],
94
-
95
- [
96
- :irb_load, :Load, "command/load"],
97
- [
98
- :irb_require, :Require, "command/load"],
99
- [
100
- :irb_source, :Source, "command/load",
101
- [:source, NO_OVERRIDE],
102
- ],
103
-
104
- [
105
- :irb, :IrbCommand, "command/subirb"],
106
- [
107
- :irb_jobs, :Jobs, "command/subirb",
108
- [:jobs, NO_OVERRIDE],
109
- ],
110
- [
111
- :irb_fg, :Foreground, "command/subirb",
112
- [:fg, NO_OVERRIDE],
113
- ],
114
- [
115
- :irb_kill, :Kill, "command/subirb",
116
- [:kill, OVERRIDE_PRIVATE_ONLY],
117
- ],
118
-
119
- [
120
- :irb_debug, :Debug, "command/debug",
121
- [:debug, NO_OVERRIDE],
122
- ],
123
- [
124
- :irb_edit, :Edit, "command/edit",
125
- [:edit, NO_OVERRIDE],
126
- ],
127
- [
128
- :irb_break, :Break, "command/break",
129
- ],
130
- [
131
- :irb_catch, :Catch, "command/catch",
132
- ],
133
- [
134
- :irb_next, :Next, "command/next"
135
- ],
136
- [
137
- :irb_delete, :Delete, "command/delete",
138
- [:delete, NO_OVERRIDE],
139
- ],
140
- [
141
- :irb_step, :Step, "command/step",
142
- [:step, NO_OVERRIDE],
143
- ],
144
- [
145
- :irb_continue, :Continue, "command/continue",
146
- [:continue, NO_OVERRIDE],
147
- ],
148
- [
149
- :irb_finish, :Finish, "command/finish",
150
- [:finish, NO_OVERRIDE],
151
- ],
152
- [
153
- :irb_backtrace, :Backtrace, "command/backtrace",
154
- [:backtrace, NO_OVERRIDE],
155
- [:bt, NO_OVERRIDE],
156
- ],
157
- [
158
- :irb_debug_info, :Info, "command/info",
159
- [:info, NO_OVERRIDE],
160
- ],
161
-
162
- [
163
- :irb_help, :Help, "command/help",
164
- [:help, NO_OVERRIDE],
165
- [:show_cmds, NO_OVERRIDE],
166
- ],
167
-
168
- [
169
- :irb_show_doc, :ShowDoc, "command/show_doc",
170
- [:show_doc, NO_OVERRIDE],
171
- ],
172
-
173
- [
174
- :irb_info, :IrbInfo, "command/irb_info"
175
- ],
176
-
177
- [
178
- :irb_ls, :Ls, "command/ls",
179
- [:ls, NO_OVERRIDE],
180
- ],
181
-
182
- [
183
- :irb_measure, :Measure, "command/measure",
184
- [:measure, NO_OVERRIDE],
185
- ],
186
-
187
- [
188
- :irb_show_source, :ShowSource, "command/show_source",
189
- [:show_source, NO_OVERRIDE],
190
- ],
191
- [
192
- :irb_whereami, :Whereami, "command/whereami",
193
- [:whereami, NO_OVERRIDE],
194
- ],
195
- [
196
- :irb_history, :History, "command/history",
197
- [:history, NO_OVERRIDE],
198
- [:hist, NO_OVERRIDE],
199
- ]
200
- ]
201
-
202
-
203
- @@commands = []
204
-
205
- def self.all_commands_info
206
- return @@commands unless @@commands.empty?
207
- user_aliases = IRB.CurrentContext.command_aliases.each_with_object({}) do |(alias_name, target), result|
208
- result[target] ||= []
209
- result[target] << alias_name
210
- end
211
-
212
- @EXTEND_COMMANDS.each do |cmd_name, cmd_class, load_file, *aliases|
213
- if !defined?(Command) || !Command.const_defined?(cmd_class, false)
214
- require_relative load_file
215
- end
216
-
217
- klass = Command.const_get(cmd_class, false)
218
- aliases = aliases.map { |a| a.first }
219
-
220
- if additional_aliases = user_aliases[cmd_name]
221
- aliases += additional_aliases
222
- end
223
-
224
- display_name = aliases.shift || cmd_name
225
- @@commands << { display_name: display_name, description: klass.description, category: klass.category }
226
- end
227
-
228
- @@commands
229
- end
230
-
231
- # Convert a command name to its implementation class if such command exists
232
- def self.load_command(command)
233
- command = command.to_sym
234
- @EXTEND_COMMANDS.each do |cmd_name, cmd_class, load_file, *aliases|
235
- next if cmd_name != command && aliases.all? { |alias_name, _| alias_name != command }
236
-
237
- if !defined?(Command) || !Command.const_defined?(cmd_class, false)
238
- require_relative load_file
239
- end
240
- return Command.const_get(cmd_class, false)
241
- end
242
- nil
243
- end
244
-
245
- # Installs the default irb commands.
246
- def self.install_extend_commands
247
- for args in @EXTEND_COMMANDS
248
- def_extend_command(*args)
249
- end
250
- end
251
-
252
- # Evaluate the given +cmd_name+ on the given +cmd_class+ Class.
253
- #
254
- # Will also define any given +aliases+ for the method.
255
- #
256
- # The optional +load_file+ parameter will be required within the method
257
- # definition.
258
- def self.def_extend_command(cmd_name, cmd_class, load_file, *aliases)
259
- case cmd_class
260
- when Symbol
261
- cmd_class = cmd_class.id2name
262
- when String
263
- when Class
264
- cmd_class = cmd_class.name
265
- end
266
-
267
- line = __LINE__; eval %[
268
- def #{cmd_name}(*opts, **kwargs, &b)
269
- Kernel.require_relative "#{load_file}"
270
- ::IRB::Command::#{cmd_class}.execute(irb_context, *opts, **kwargs, &b)
271
- end
272
- ], nil, __FILE__, line
273
-
274
- for ali, flag in aliases
275
- @ALIASES.push [ali, cmd_name, flag]
276
- end
277
- end
278
-
279
- # Installs alias methods for the default irb commands, see
280
- # ::install_extend_commands.
281
- def install_alias_method(to, from, override = NO_OVERRIDE)
282
- to = to.id2name unless to.kind_of?(String)
283
- from = from.id2name unless from.kind_of?(String)
284
-
285
- if override == OVERRIDE_ALL or
286
- (override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
287
- (override == NO_OVERRIDE) && !respond_to?(to, true)
288
- target = self
289
- (class << self; self; end).instance_eval{
290
- if target.respond_to?(to, true) &&
291
- !target.respond_to?(EXCB.irb_original_method_name(to), true)
292
- alias_method(EXCB.irb_original_method_name(to), to)
293
- end
294
- alias_method to, from
295
- }
296
- else
297
- Kernel.warn "irb: warn: can't alias #{to} from #{from}.\n"
16
+ # Registers a command with the given name.
17
+ # Aliasing is intentionally not supported at the moment.
18
+ def register(name, command_class)
19
+ @commands[name.to_sym] = [command_class, []]
298
20
  end
299
21
  end
300
-
301
- def self.irb_original_method_name(method_name) # :nodoc:
302
- "irb_" + method_name + "_org"
303
- end
304
-
305
- # Installs alias methods for the default irb commands on the given object
306
- # using #install_alias_method.
307
- def self.extend_object(obj)
308
- unless (class << obj; ancestors; end).include?(EXCB)
309
- super
310
- for ali, com, flg in @ALIASES
311
- obj.install_alias_method(ali, com, flg)
312
- end
313
- end
314
- end
315
-
316
- install_extend_commands
317
22
  end
318
23
  end
@@ -86,6 +86,14 @@ module IRB
86
86
  )
87
87
  end
88
88
 
89
+ def command_completions(preposing, target)
90
+ if preposing.empty? && !target.empty?
91
+ IRB::Command.command_names.select { _1.start_with?(target) }
92
+ else
93
+ []
94
+ end
95
+ end
96
+
89
97
  def retrieve_files_to_require_relative_from_current_dir
90
98
  @files_from_current_dir ||= Dir.glob("**/*.{rb,#{RbConfig::CONFIG['DLEXT']}}", base: '.').map { |path|
91
99
  path.sub(/\.(rb|#{RbConfig::CONFIG['DLEXT']})\z/, '')
@@ -103,9 +111,11 @@ module IRB
103
111
  end
104
112
 
105
113
  def completion_candidates(preposing, target, _postposing, bind:)
114
+ commands = command_completions(preposing, target)
106
115
  result = ReplTypeCompletor.analyze(preposing + target, binding: bind, filename: @context.irb_path)
107
- return [] unless result
108
- result.completion_candidates.map { target + _1 }
116
+ return commands unless result
117
+
118
+ commands | result.completion_candidates.map { target + _1 }
109
119
  end
110
120
 
111
121
  def doc_namespace(preposing, matched, _postposing, bind:)
@@ -181,7 +191,8 @@ module IRB
181
191
  result = complete_require_path(target, preposing, postposing)
182
192
  return result if result
183
193
  end
184
- retrieve_completion_data(target, bind: bind, doc_namespace: false).compact.map{ |i| i.encode(Encoding.default_external) }
194
+ commands = command_completions(preposing || '', target)
195
+ commands | retrieve_completion_data(target, bind: bind, doc_namespace: false).compact.map{ |i| i.encode(Encoding.default_external) }
185
196
  end
186
197
 
187
198
  def doc_namespace(_preposing, matched, _postposing, bind:)
@@ -388,7 +399,7 @@ module IRB
388
399
 
389
400
  if doc_namespace
390
401
  rec_class = rec.is_a?(Module) ? rec : rec.class
391
- "#{rec_class.name}#{sep}#{candidates.find{ |i| i == message }}"
402
+ "#{rec_class.name}#{sep}#{candidates.find{ |i| i == message }}" rescue nil
392
403
  else
393
404
  select_message(receiver, message, candidates, sep)
394
405
  end
@@ -418,7 +429,7 @@ module IRB
418
429
  vars = (bind.local_variables | bind.eval_instance_variables).collect{|m| m.to_s}
419
430
  perfect_match_var = vars.find{|m| m.to_s == input}
420
431
  if perfect_match_var
421
- eval("#{perfect_match_var}.class.name", bind)
432
+ eval("#{perfect_match_var}.class.name", bind) rescue nil
422
433
  else
423
434
  candidates = (bind.eval_methods | bind.eval_private_methods | bind.local_variables | bind.eval_instance_variables | bind.eval_class_constants).collect{|m| m.to_s}
424
435
  candidates |= ReservedWords
data/lib/irb/context.rb CHANGED
@@ -585,31 +585,45 @@ module IRB
585
585
  @inspect_mode
586
586
  end
587
587
 
588
- def evaluate(line, line_no) # :nodoc:
588
+ def evaluate(statement, line_no) # :nodoc:
589
589
  @line_no = line_no
590
- result = nil
591
590
 
591
+ case statement
592
+ when Statement::EmptyInput
593
+ return
594
+ when Statement::Expression
595
+ result = evaluate_expression(statement.code, line_no)
596
+ set_last_value(result)
597
+ when Statement::Command
598
+ statement.command_class.execute(self, statement.arg)
599
+ set_last_value(nil)
600
+ end
601
+
602
+ nil
603
+ end
604
+
605
+ def evaluate_expression(code, line_no) # :nodoc:
606
+ result = nil
592
607
  if IRB.conf[:MEASURE] && IRB.conf[:MEASURE_CALLBACKS].empty?
593
608
  IRB.set_measure_callback
594
609
  end
595
610
 
596
611
  if IRB.conf[:MEASURE] && !IRB.conf[:MEASURE_CALLBACKS].empty?
597
612
  last_proc = proc do
598
- result = workspace.evaluate(line, @eval_path, line_no)
613
+ result = workspace.evaluate(code, @eval_path, line_no)
599
614
  end
600
615
  IRB.conf[:MEASURE_CALLBACKS].inject(last_proc) do |chain, item|
601
616
  _name, callback, arg = item
602
617
  proc do
603
- callback.(self, line, line_no, arg) do
618
+ callback.(self, code, line_no, arg) do
604
619
  chain.call
605
620
  end
606
621
  end
607
622
  end.call
608
623
  else
609
- result = workspace.evaluate(line, @eval_path, line_no)
624
+ result = workspace.evaluate(code, @eval_path, line_no)
610
625
  end
611
-
612
- set_last_value(result)
626
+ result
613
627
  end
614
628
 
615
629
  def inspect_last_value # :nodoc:
@@ -646,17 +660,5 @@ module IRB
646
660
  def local_variables # :nodoc:
647
661
  workspace.binding.local_variables
648
662
  end
649
-
650
- # Return true if it's aliased from the argument and it's not an identifier.
651
- def symbol_alias?(command)
652
- return nil if command.match?(/\A\w+\z/)
653
- command_aliases.key?(command.to_sym)
654
- end
655
-
656
- # Return true if the command supports transforming args
657
- def transform_args?(command)
658
- command = command_aliases.fetch(command.to_sym, command)
659
- ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args)
660
- end
661
663
  end
662
664
  end