rcodetools 0.4.1.0 → 0.5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGES CHANGED
@@ -1,6 +1,15 @@
1
1
  rcodetools history
2
2
  ==================
3
+
4
+ User-visible changes since 0.4.1
5
+ --------------------------------
6
+ * --dev: adds project directories to $:
7
+ * --completion-class-info: list completion candidates and class info
8
+ * display completion candidates with description, both in emacs
9
+ and vim (using the menu+preview window).
10
+
3
11
  User-visible changes since 0.4.0
12
+ --------------------------------
4
13
  * rct-meth-args: implemented -I
5
14
  * many bug fixes
6
15
 
data/README CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  rcodetools http://eigenclass.org/hiki.rb?rcodetools
3
- Copyright (c) 2005-2006 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
4
- Copyright (c) 2006 rubikitch <rubikitch@ruby-lang.org> http://www.rubyist.net/~rubikitch/
3
+ Copyright (c) 2005-2007 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
4
+ Copyright (c) 2006-2007 rubikitch <rubikitch@ruby-lang.org> http://www.rubyist.net/~rubikitch/
5
5
  Use and distribution subject to the terms of the Ruby license.
6
6
 
7
7
  = Overview
data/README.vim CHANGED
@@ -9,6 +9,22 @@ rcodetools.vim redefines user-defined completion for Ruby programs, so you can
9
9
  use the intelligent, 100%-accurate completion with <C-X><C-U> in insert mode.
10
10
  Note that this runs the code to obtain the exact candidate list.
11
11
 
12
+ If you've set completeopt to menu,preview then rcodetools.vim can display
13
+ information about the completion candidates. The menu will show the synopsis
14
+ as given in the RI documentation, and the preview window will contain the full
15
+ RI documentation.
16
+
17
+ This functionality relies on fri for quick lookups. It can be enabled by setting
18
+
19
+ let g:rct_completion_use_fri = 1 " 0 by default (disabled)
20
+
21
+ in your .vimrc (don't forget to run fastri-server too).
22
+ Obtaining the documentation for many candidates can be slow, so you can set
23
+ the threshold above which additional documentation will not be shown with
24
+
25
+ " 20 by default, about a couple secs max wait on a normal machine
26
+ let g:rct_completion_info_max_len = 20
27
+
12
28
  Quick RI documentation and exact tag jumping
13
29
  ============================================
14
30
  When you're editing a Ruby file, <C-]> will jump to the definition of the
data/bin/rct-complete CHANGED
@@ -21,6 +21,9 @@ opts = OptionParser.new do |opts|
21
21
  opts.on("--completion-emacs-icicles", "Generate completion code for Emacs/Icicles.") do
22
22
  klass = XMPCompletionEmacsIciclesFilter
23
23
  end
24
+ opts.on("--completion-class-info", "List completion candidates with class.") do
25
+ klass = XMPCompletionClassInfoFilter
26
+ end
24
27
 
25
28
  opts.handle_position options
26
29
  opts.handle_interpreter options
data/bin/rct-meth-args CHANGED
@@ -1,11 +1,11 @@
1
- #!/usr/bin/env ruby
1
+ #! /home/batsman/usr//bin/ruby
2
2
  # Copyright (c)
3
- # 2006 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
4
- # 2006 rubikitch <rubikitch@ruby-lang.org> http://www.rubyist.net/~rubikitch/
3
+ # 2006-2007 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
4
+ # 2006-2007 rubikitch <rubikitch@ruby-lang.org> http://www.rubyist.net/~rubikitch/
5
5
  #
6
6
  # Use and distribution subject to the same conditions as Ruby.
7
7
 
8
-
8
+ require 'rcodetools/options'
9
9
  $VERBOSE = nil
10
10
  $__method_args_off = true
11
11
 
@@ -14,7 +14,8 @@ if ARGV.empty? or ARGV.include? '-h' or ARGV.include? '--help'
14
14
  rct-meth-args [-Idirectory] [-i] [-m] [-c] [-n] <file> [<file> ...]
15
15
 
16
16
  -Idirectory specify $LOAD_PATH directory (same as ruby)
17
-
17
+ --dev Add this project's bin/ and lib/ to $LOAD_PATH.
18
+ A directory that has Rakefile is considered as project base direcotry.
18
19
  -i omit instance methods defined in classes
19
20
  -m omit instance methods defined in modules
20
21
  -c omit class methods
@@ -256,7 +257,8 @@ ARGV.each do |arg|
256
257
  when "-t"; $__printer = TagsPrinter.new; $__with_location = true
257
258
  when /-I(.+)$/; $:.unshift $1
258
259
  when "-I"; i_opt_p = true
259
- when /-./; omissions[$&] = true
260
+ when "--dev"; OptionHandler.auto_include_paths($:, Dir.pwd)
261
+ when /^-.$/; omissions[$&] = true
260
262
  else
261
263
  if i_opt_p
262
264
  $:.unshift arg
@@ -397,7 +399,13 @@ end
397
399
 
398
400
  $__method_args_off = false
399
401
 
400
- ARGV.each{|x| require x}
402
+ ARGV.each{|x|
403
+ begin
404
+ require x
405
+ rescue LoadError
406
+ load x
407
+ end
408
+ }
401
409
 
402
410
  $__method_args_off = true
403
411
  # END { puts "zzzz OK" }
@@ -1,6 +1,6 @@
1
1
  ;;; icicles-rcodetools.el -- accurate completion with icicles
2
2
 
3
- ;;; Copyright (c) 2006 rubikitch <rubikitch@ruby-lang.org>
3
+ ;;; Copyright (c) 2006-2007 rubikitch <rubikitch@ruby-lang.org>
4
4
  ;;;
5
5
  ;;; Use and distribution subject to the terms of the Ruby license.
6
6
 
@@ -23,9 +23,12 @@ See also `rct-interactive'."
23
23
  rct-method-completion-table
24
24
  nil nil pattern nil nil nil
25
25
  ((end (point)) beg
26
- pattern klass
26
+ (icicle-list-join-string "\t")
27
+ (icicle-list-use-nth-parts '(1))
28
+ (icicle-point-position-in-candidate 'input-end)
29
+ pattern klass alist
27
30
  (icicle-candidate-help-fn
28
- (lambda (result) (ri result klass)))) ;bindings
31
+ (lambda (result) (ri (cdr (assoc result alist)))))) ;bindings
29
32
  (rct-exec-and-eval rct-complete-command-name "--completion-emacs-icicles"))
30
33
 
31
34
  (provide 'icicles-rcodetools)
@@ -1,3 +1,6 @@
1
+ # Nearly 100% accurate completion for any editors!!
2
+ # by rubikitch <rubikitch@ruby-lang.org>
3
+
1
4
  require 'rcodetools/xmpfilter'
2
5
  require 'enumerator'
3
6
  # Common routines for XMPCompletionFilter/XMPDocFilter
@@ -150,7 +153,7 @@ XXX
150
153
  i+1==lineno ? prepare_line(line.chomp, column) : line
151
154
  }.join
152
155
  newcode << add_BEGIN if @ignore_NoMethodError
153
- debugprint "newcode", newcode, "-"*80
156
+ debugprint "newcode", newcode.gsub(/;/, "\n"), "-"*80
154
157
  stdout, stderr = execute(newcode)
155
158
  output = stderr.readlines
156
159
  debugprint "stdout", output, "-"*80
@@ -171,6 +174,15 @@ XXX
171
174
  runtime_data_with_class(code, lineno, column)[1]
172
175
  end
173
176
 
177
+ def __magic_help_code(result, v, meth)
178
+ code = <<-EOC
179
+ #{result} = #{v}.method(#{meth}).inspect.match( %r[\\A#<(?:Unbound)?Method: (.*?)>\\Z] )[1].sub(/\\A.*?\\((.*?)\\)(.*)\\Z/){ "\#{$1}\#{$2}" }.sub(/#<Class:(.*?)>#/) { "\#{$1}." }
180
+ #{result} = #{v}.to_s + ".new" if #{result} == 'Class#new' and #{v}.private_method_defined?(:initialize)
181
+ #{result} = "Object#" + #{meth} if #{result} =~ /^Kernel#/ and Kernel.instance_methods(false).include? #{meth}
182
+ #{result}
183
+ EOC
184
+ end
185
+
174
186
  end
175
187
 
176
188
  # Nearly 100% accurate completion for any editors!!
@@ -178,6 +190,11 @@ end
178
190
  class XMPCompletionFilter < XMPFilter
179
191
  include ProcessParticularLine
180
192
 
193
+ class << self
194
+ attr_accessor :candidates_with_description_flag
195
+ end
196
+ @candidates_with_description_flag = false
197
+
181
198
  # String completion begins with this.
182
199
  attr :prefix
183
200
 
@@ -185,49 +202,77 @@ class XMPCompletionFilter < XMPFilter
185
202
  new(opts).completion_code(code, opts[:lineno], opts[:column])
186
203
  end
187
204
 
205
+ def magic_help_code(recv, meth)
206
+ oneline_ize __magic_help_code("#{VAR}_result", recv, meth)
207
+ end
208
+
209
+ def methods_map_code(recv)
210
+ # delimiter is \0
211
+ %Q[map{|m| "\#{m}\\0" + #{magic_help_code((recv), 'm')}}]
212
+ end
213
+
214
+ def split_method_info(minfo)
215
+ minfo.split(/\0/,2)
216
+ end
217
+
188
218
  def prepare_line(expr, column)
189
219
  set_expr_and_postfix!(expr, column){|c| /^.{#{c}}/ }
190
220
  @prefix = expr
191
221
  case expr
192
222
  when /^\$\w+$/ # global variable
193
- __prepare_line 'nil', 'global_variables'
223
+ __prepare_line 'nil', 'global_variables', '%n'
194
224
  when /^@@\w+$/ # class variable
195
- __prepare_line 'nil', 'Module === self ? class_variables : self.class.class_variables'
225
+ __prepare_line 'nil', 'Module === self ? class_variables : self.class.class_variables', '%n'
196
226
  when /^@\w+$/ # instance variable
197
- __prepare_line 'nil', 'instance_variables'
227
+ __prepare_line 'nil', 'instance_variables', '%n'
198
228
  when /^([A-Z].*)::([^.]*)$/ # nested constants / class methods
199
229
  @prefix = $2
200
- __prepare_line $1, "#$1.constants | #$1.methods(true)"
230
+ __prepare_line $1, "#$1.constants | #$1.methods(true)",
231
+ %Q[#$1.constants + #$1.methods(true).#{methods_map_code($1)}]
201
232
  when /^[A-Z]\w*$/ # normal constants
202
- __prepare_line 'nil', 'Module.constants'
233
+ __prepare_line 'nil', 'Module.constants', '%n'
203
234
  when /^(.*::.+)\.(.+)$/ # toplevel class methods
204
235
  @prefix = $2
205
- __prepare_line $1, "#$1.methods"
236
+ __prepare_line $1, "#$1.methods",
237
+ %Q[%n.#{methods_map_code($1)}]
206
238
  when /^(::.+)::(.*)$/ # toplevel nested constants
207
239
  @prefix = $2
208
- __prepare_line $1, "#$1.constants | #$1.methods"
240
+ __prepare_line $1, "#$1.constants | #$1.methods",
241
+ %Q[#$1.constants + #$1.methods.#{methods_map_code($1)}]
209
242
  when /^::(.*)/ # toplevel constant
210
243
  @prefix = $1
211
- __prepare_line 'nil', 'Object.constants'
244
+ __prepare_line 'nil', 'Object.constants', '%n'
212
245
  when /^(:[^:.]*)$/ # symbol
213
- __prepare_line 'nil', 'Symbol.all_symbols.map{|s| ":" + s.id2name}'
246
+ __prepare_line 'nil', 'Symbol.all_symbols.map{|s| ":" + s.id2name}', '%n'
214
247
  when /\.([^.]*)$/ # method call
215
248
  @prefix = $1
216
249
  recv = Regexp.last_match.pre_match
217
- __prepare_line recv, "(#{recv}).methods(true)"
250
+ __prepare_line recv, "(#{recv}).methods(true)",
251
+ %Q[%n.#{methods_map_code(recv)}]
218
252
  else # bare words
219
- __prepare_line 'self', "methods | private_methods | local_variables | self.class.constants"
253
+ __prepare_line 'self', "methods | private_methods | local_variables | self.class.constants",
254
+ %Q[(methods | private_methods).#{methods_map_code('self')} + local_variables | self.class.constants]
220
255
  end
221
256
  end
222
257
 
223
- def __prepare_line(recv, all_completion_expr)
258
+ def __prepare_line(recv, all_completion_expr, all_completion_expr_verbose)
259
+ if self.class.candidates_with_description_flag
260
+ ___prepare_line(recv, all_completion_expr_verbose.gsub(/%n/, '('+all_completion_expr+')'))
261
+ else
262
+ ___prepare_line(recv, all_completion_expr)
263
+ end
264
+
265
+ end
266
+
267
+ def ___prepare_line(recv, all_completion_expr)
224
268
  v = "#{VAR}"
269
+ rcv = "#{VAR}_recv"
225
270
  idx = 1
226
271
  oneline_ize(<<EOC)
272
+ #{rcv} = (#{recv})
227
273
  #{v} = (#{all_completion_expr}).grep(/^#{Regexp.quote(@prefix)}/)
228
- #{v}2 = (#{recv})
229
- #{v}2 = Module === #{v}2 ? #{v}2 : #{v}2.class
230
- $stderr.puts("#{MARKER}[#{idx}] => " + #{v}2.to_s + " " + #{v}.join(" ")) || #{v}
274
+ #{rcv} = Module === #{rcv} ? #{rcv} : #{rcv}.class
275
+ $stderr.puts("#{MARKER}[#{idx}] => " + #{rcv}.to_s + " " + #{v}.join(" ")) || #{v}
231
276
  exit
232
277
  EOC
233
278
  end
@@ -235,7 +280,7 @@ EOC
235
280
  # Array of completion candidates.
236
281
  def candidates(code, lineno, column=nil)
237
282
  methods = runtime_data(code, lineno, column) rescue ""
238
- methods.split.sort
283
+ methods.split(/ /).sort
239
284
  end
240
285
 
241
286
  # Completion code for editors.
@@ -244,18 +289,38 @@ EOC
244
289
  end
245
290
  end
246
291
 
292
+ # for debugging XMPCompletionEmacsFilter
293
+ class XMPCompletionVerboseFilter < XMPCompletionFilter
294
+ @candidates_with_description_flag = true
295
+ end
296
+
297
+ class XMPCompletionClassInfoFilter < XMPCompletionFilter
298
+ @candidates_with_description_flag = true
299
+
300
+ def completion_code(code, lineno, column=nil)
301
+ candidates(code, lineno, column).join("\n").tr("\0", "\t")
302
+ end
303
+ end
304
+
247
305
  class XMPCompletionEmacsFilter < XMPCompletionFilter
306
+ @candidates_with_description_flag = true
307
+
248
308
  def completion_code(code, lineno, column=nil)
249
309
  elisp = "(progn\n"
250
- elisp << "(setq rct-method-completion-table '("
310
+ table = "(setq rct-method-completion-table '("
311
+ alist = "(setq alist '("
251
312
  begin
252
- candidates(code, lineno, column).each do |meth|
253
- elisp << format('("%s") ', meth)
313
+ candidates(code, lineno, column).sort.each do |minfo|
314
+ meth, description = split_method_info(minfo)
315
+ table << format('("%s") ', meth)
316
+ alist << format('("%s\\t[%s]") ', meth, description)
254
317
  end
318
+ table << "))\n"
319
+ alist << "))\n"
255
320
  rescue Exception => err
256
321
  return %Q[(error "#{err.message}")]
257
322
  end
258
- elisp << "))\n"
323
+ elisp << table << alist
259
324
  elisp << %Q[(setq pattern "#{prefix}")\n]
260
325
  elisp << %Q[(try-completion pattern rct-method-completion-table nil)\n]
261
326
  elisp << ")" # /progn
@@ -263,23 +328,31 @@ class XMPCompletionEmacsFilter < XMPCompletionFilter
263
328
  end
264
329
 
265
330
  class XMPCompletionEmacsIciclesFilter < XMPCompletionFilter
331
+ @candidates_with_description_flag = true
332
+
266
333
  def candidates(code, lineno, column=nil)
267
334
  klass, methods = runtime_data_with_class(code, lineno, column) rescue ["", ""]
268
335
  @klass = klass
269
- methods.split.sort
336
+ methods.split(/ /).sort
270
337
  end
271
338
 
272
339
  def completion_code(code, lineno, column=nil)
273
340
  elisp = "(progn\n"
274
- elisp << "(setq rct-method-completion-table '("
341
+ table = "(setq rct-method-completion-table '("
342
+ help_alist = "(setq alist '("
343
+
275
344
  begin
276
- candidates(code, lineno, column).each do |meth|
277
- elisp << format('("%s") ', meth)
345
+ candidates(code, lineno, column).sort.each do |minfo|
346
+ meth, description = split_method_info(minfo)
347
+ table << format('("%s\\t[%s]") ', meth, description)
348
+ help_alist << format('("%s" . "%s")', meth, description)
278
349
  end
350
+ table << "))\n"
351
+ help_alist << "))\n"
279
352
  rescue Exception => err
280
353
  return %Q[(error "#{err.message}")]
281
354
  end
282
- elisp << "))\n"
355
+ elisp << table << help_alist
283
356
  elisp << %Q[(setq pattern "#{prefix}")\n]
284
357
  elisp << %Q[(setq klass "#{@klass}")\n]
285
358
  elisp << ")" # /progn
@@ -46,6 +46,7 @@ class XMPDocFilter < XMPFilter
46
46
 
47
47
  def __prepare_line(x)
48
48
  v = "#{VAR}"
49
+ result = "#{VAR}_result"
49
50
  klass = "#{VAR}_klass"
50
51
  flag = "#{VAR}_flag"
51
52
  which_methods = "#{VAR}_methods"
@@ -55,34 +56,18 @@ class XMPDocFilter < XMPFilter
55
56
  meth = x[:meth_or_constant] || x[:meth]
56
57
  debugprint "recv=#{recv}", "meth=#{meth}"
57
58
  if meth
59
+ # imported from fastri/MagicHelp
58
60
  code = <<-EOC
59
61
  #{v} = (#{recv})
60
- if Class === #{v}
61
- #{flag} = #{v}.respond_to?('#{meth}') ? "." : "::"
62
- #{klass} = #{v}
63
- #{which_methods} = :methods
64
- else
65
- #{flag} = "#"
66
- #{klass} = #{v}.class
67
- #{which_methods} = :instance_methods
68
- end
69
- #{ancestor_class} = #{klass}.ancestors.delete_if{|c| c==Kernel }.find{|c| c.__send__(#{which_methods}, false).include? '#{meth}' }
70
62
  $stderr.print("#{MARKER}[#{idx}] => " + #{v}.class.to_s + " ")
71
63
 
72
- if #{ancestor_class}
73
- $stderr.puts(#{ancestor_class}.to_s + #{flag} + '#{meth}')
64
+ if Module === #{v} and '#{meth}' =~ /^[A-Z]/ and #{v}.const_defined?('#{meth}')
65
+ #{result} = #{v}.to_s + "::#{meth}"
74
66
  else
75
- if '#{meth}' == 'new' and #{v}.private_method_defined?(:initialize)
76
- $stderr.puts(#{v}.to_s + #{flag} + '#{meth}'); exit
77
- end
78
-
79
- [Kernel, Module, Class].each do |k|
80
- if (k.instance_methods(false) + k.private_instance_methods(false)).include? '#{meth}'
81
- $stderr.printf("%s#%s\\n", k, '#{meth}'); exit
82
- end
83
- end
84
- $stderr.puts(#{v}.to_s + '::' + '#{meth}')
67
+ #{__magic_help_code result, v, meth.dump}
85
68
  end
69
+
70
+ $stderr.puts(#{result})
86
71
  exit
87
72
  EOC
88
73
  else
@@ -154,7 +139,7 @@ end
154
139
 
155
140
  class XMPRiFilter < XMPDocFilter
156
141
  def doc(code, lineno, column=nil)
157
- "ri '#{super}'"
142
+ "ri '#{super.sub(/\./, '::')}'"
158
143
  end
159
144
  end
160
145
 
@@ -26,6 +26,10 @@ module OptionHandler
26
26
  on("-I PATH", "Add PATH to $LOAD_PATH") do |path|
27
27
  options[:include_paths] << path
28
28
  end
29
+ on("--dev", "Add this project's bin/ and lib/ to $LOAD_PATH.",
30
+ "A directory with a Rakefile is considered a project base directory.") do
31
+ auto_include_paths(options[:include_paths], Dir.pwd)
32
+ end
29
33
  on("-r LIB", "Require LIB before execution.") do |lib|
30
34
  options[:libs] << lib
31
35
  end
@@ -55,6 +59,14 @@ module OptionHandler
55
59
  end
56
60
  end
57
61
 
62
+ def auto_include_paths(include_paths, pwd)
63
+ if pwd =~ %r!^(.+)/(lib|bin)!
64
+ include_paths.unshift("#$1/lib").unshift("#$1/bin")
65
+ elsif File.file? "#{pwd}/Rakefile" or File.file? "#{pwd}/rakefile"
66
+ include_paths.unshift("#{pwd}/lib").unshift("#{pwd}/bin")
67
+ end
68
+ end
69
+ module_function :auto_include_paths
58
70
 
59
71
  end
60
72
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (c) 2005-2006 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
2
+ # Copyright (c) 2005-2007 Mauricio Fernandez <mfp@acm.org> http://eigenclass.org
3
3
  # rubikitch <rubikitch@ruby-lang.org>
4
4
  # Use and distribution subject to the terms of the Ruby license.
5
5
 
6
6
  class XMPFilter
7
- VERSION = "0.4.1"
7
+ VERSION = "0.5.0"
8
8
 
9
9
  MARKER = "!XMP#{Time.new.to_i}_#{Process.pid}_#{rand(1000000)}!"
10
10
  XMP_RE = Regexp.new("^" + Regexp.escape(MARKER) + '\[([0-9]+)\] (=>|~>|==>) (.*)')
data/rcodetools.el CHANGED
@@ -4,11 +4,11 @@
4
4
  ;;;
5
5
  ;;; Use and distribution subject to the terms of the Ruby license.
6
6
 
7
- (defvar xmpfilter-command-name "ruby -S xmpfilter"
7
+ (defvar xmpfilter-command-name "ruby -S xmpfilter --dev"
8
8
  "The xmpfilter command name.")
9
- (defvar rct-doc-command-name "ruby -S rct-doc"
9
+ (defvar rct-doc-command-name "ruby -S rct-doc --dev"
10
10
  "The rct-doc command name.")
11
- (defvar rct-complete-command-name "ruby -S rct-complete"
11
+ (defvar rct-complete-command-name "ruby -S rct-complete --dev"
12
12
  "The rct-complete command name.")
13
13
  (defvar rct-option-history nil) ;internal
14
14
  (defvar rct-option-local nil) ;internal
@@ -89,7 +89,7 @@ See also `rct-interactive', `rct-complete-symbol--normal', and `rct-complete-sym
89
89
  See also `rct-interactive'."
90
90
  (interactive (rct-interactive))
91
91
  (let ((end (point)) beg
92
- pattern
92
+ pattern alist
93
93
  completion)
94
94
  (setq completion (rct-try-completion)) ; set also pattern / completion
95
95
  (save-excursion
@@ -108,7 +108,7 @@ See also `rct-interactive'."
108
108
  (message "Making completion list...")
109
109
  (with-output-to-temp-buffer "*Completions*"
110
110
  (display-completion-list
111
- (all-completions pattern rct-method-completion-table)))
111
+ (all-completions pattern alist)))
112
112
  (message "Making completion list...%s" "done")))))
113
113
 
114
114
  ;; (define-key ruby-mode-map "\M-\C-i" 'rct-complete-symbol)
data/rcodetools.vim CHANGED
@@ -58,10 +58,30 @@ function! <SID>RCT_completion(findstart, base)
58
58
  else
59
59
  let line = line('.')
60
60
  let column = s:rct_completion_col
61
- let command = "rct-complete --line=" . line . " --column=" . column . " " . s:rct_tmpfile
62
- let ret = split(system(command))
61
+ let command = "rct-complete --completion-class-info --line=" . line . " --column=" . column . " " . s:rct_tmpfile
62
+ let data = split(system(command), '\n')
63
+
64
+ for dline in data
65
+ let parts = split(dline, "\t")
66
+ let name = get(parts, 0)
67
+ let selector = get(parts, 1)
68
+ echo name
69
+ echo selector
70
+ if s:GetOption('rct_completion_use_fri', 0) && s:GetOption('rct_completion_info_max_len', 20) >= len(data)
71
+ let fri_data = system('fri -f plain ' . "'" . selector . "'" . ' 2>/dev/null')
72
+ call complete_add({'word': name,
73
+ \ 'menu': get(split(fri_data), 2, ''),
74
+ \ 'info': fri_data } )
75
+ else
76
+ call complete_add(name)
77
+ endif
78
+ if complete_check()
79
+ break
80
+ endif
81
+ endfor
82
+
63
83
  call delete(s:rct_tmpfile)
64
- return ret
84
+ return []
65
85
  endif
66
86
  endfunction
67
87
 
@@ -1,5 +1,6 @@
1
1
  (progn
2
2
  (setq rct-method-completion-table '(("uniq") ("uniq!") ))
3
+ (setq alist '(("uniq\t[Array#uniq]") ("uniq!\t[Array#uniq!]") ))
3
4
  (setq pattern "uni")
4
5
  (try-completion pattern rct-method-completion-table nil)
5
6
  )
@@ -1,5 +1,6 @@
1
1
  (progn
2
- (setq rct-method-completion-table '(("div") ("divmod") ))
2
+ (setq rct-method-completion-table '(("div\t[Fixnum#div]") ("divmod\t[Fixnum#divmod]") ))
3
+ (setq alist '(("div" . "Fixnum#div")("divmod" . "Fixnum#divmod")))
3
4
  (setq pattern "div")
4
5
  (setq klass "Fixnum")
5
6
  )
@@ -493,3 +493,148 @@ EOC
493
493
  assert_equal("String", get_class("'a'.siz", 1))
494
494
  end
495
495
  end
496
+
497
+
498
+ class TestXMPCompletionVerboseFilter < Test::Unit::TestCase
499
+ def doit(code, lineno, column=nil, options={})
500
+ xmp = XMPCompletionVerboseFilter.new options
501
+ xmp.candidates(code, lineno, column).sort
502
+ end
503
+
504
+ def test_complete_global_variable
505
+ assert_equal(["$hoge"], doit(<<EOC, 2))
506
+ $hoge = 100
507
+ $ho
508
+ EOC
509
+ end
510
+
511
+ def test_complete_instance_variable
512
+ assert_equal(["@hoge"], doit(<<EOC, 2))
513
+ @hoge = 100
514
+ @ho
515
+ EOC
516
+ end
517
+
518
+ def test_complete_class_variable_module
519
+ assert_equal(["@@hoge"], doit(<<EOC, 3))
520
+ module X
521
+ @@hoge = 100
522
+ @@ho
523
+ end
524
+ EOC
525
+ end
526
+
527
+ def test_complete_constant__nested
528
+ assert_equal(["Stat"], doit('File::Sta',1))
529
+ end
530
+
531
+ def test_complete_class_method
532
+ assert_equal(["popen\0IO.popen"], doit('File::pop',1))
533
+ assert_equal(["popen\0IO.popen"], doit('::File::pop',1))
534
+
535
+ assert_equal(["popen\0IO.popen"], doit('File.pop',1))
536
+ assert_equal(["popen\0IO.popen"], doit('::File.pop',1))
537
+
538
+ assert_equal(["new\0File::Stat.new"], doit('::File::Stat.ne', 1))
539
+ assert_equal(["new\0File::Stat.new"], doit('File::Stat.ne',1))
540
+
541
+ end
542
+
543
+ def test_complete_constant__in_class
544
+ assert_equal(["Fixclass", "Fixnum"], doit(<<EOC, 3))
545
+ class Fixclass
546
+ class Bar
547
+ Fix
548
+ end
549
+ end
550
+ EOC
551
+ end
552
+
553
+
554
+ def test_complete_toplevel_constant
555
+ assert_equal(["Fixnum"], doit(<<EOC,3))
556
+ class Foo
557
+ class Fixnum
558
+ ::Fixn
559
+ end
560
+ end
561
+ EOC
562
+
563
+ assert_equal(["Fixnum"], doit(<<EOC,3))
564
+ class Foo
565
+ class Fixnum
566
+ ::Foo::Fixn
567
+ end
568
+ end
569
+ EOC
570
+
571
+ assert_equal(["Bar"], doit(<<EOC,5))
572
+ class Foo
573
+ class Bar
574
+ end
575
+ end
576
+ ::Foo::B
577
+ EOC
578
+ end
579
+
580
+ def test_complete_symbol
581
+ assert_equal([":vccaex"], doit(<<EOC,2))
582
+ a = :vccaex
583
+ :vcca
584
+ EOC
585
+
586
+ end
587
+
588
+ def test_method_chain__String
589
+ assert_equal(["length\0String#length"], doit('"a".upcase.capitalize.leng', 1))
590
+ end
591
+
592
+ def test_bare_word__local_variable
593
+ assert_equal(["aaaaaxx"], doit(<<EOC,2))
594
+ aaaaaxx = 1
595
+ aaaa
596
+ EOC
597
+ end
598
+
599
+ def test_bare_word__method
600
+ assert_equal(["trace_var\0Kernel#trace_var"], doit("trace",1))
601
+ end
602
+
603
+ def test_bare_word__constant
604
+ assert_equal(["Fixnum"], doit("Fixn",1))
605
+ end
606
+
607
+ def test_bare_word__method_in_class
608
+ assert_equal(["attr_accessor\0Module#attr_accessor"], doit(<<EOC,2))
609
+ class X
610
+ attr_acc
611
+ end
612
+ EOC
613
+ end
614
+
615
+ def test_bare_word__public_method
616
+ assert_equal(["hoge\0X#hoge"], doit(<<EOC,4))
617
+ class X
618
+ def hoge() end
619
+ def boke
620
+ hog
621
+ end
622
+ new.boke
623
+ end
624
+ EOC
625
+ end
626
+
627
+ def test_bare_word__private_method
628
+ assert_equal(["hoge\0X#hoge"], doit(<<EOC,5))
629
+ class X
630
+ def hoge() end
631
+ private :hoge
632
+ def boke
633
+ hog
634
+ end
635
+ new.boke
636
+ end
637
+ EOC
638
+ end
639
+
640
+ end
data/test/test_doc.rb CHANGED
@@ -150,6 +150,14 @@ end
150
150
  EOC
151
151
  end
152
152
 
153
+ def test_bare_word__Class_object_id
154
+ assert_equal("Object#object_id", doit(<<EOC, 2))
155
+ class Foo
156
+ object_id
157
+ end
158
+ EOC
159
+ end
160
+
153
161
 
154
162
  def test_bare_word__self
155
163
  assert_equal("Foo#foo", doit(<<EOC, 3))
@@ -417,6 +425,20 @@ end
417
425
  EOC
418
426
  end
419
427
  end
428
+ end
429
+
430
+ class TestXMPRiFilter < Test::Unit::TestCase
431
+ def doit(code, lineno, column=nil, options={})
432
+ xmp = XMPRiFilter.new options
433
+ xmp.doc(code, lineno, column)
434
+ end
420
435
 
436
+ def test_class_method__IO_popen
437
+ assert_equal("ri 'IO::popen'", doit("IO::popen", 1))
438
+ assert_equal("ri 'IO::popen'", doit("IO.popen", 1))
439
+ end
421
440
 
441
+ def test_instance_method__Array
442
+ assert_equal("ri 'Array#length'", doit("[].length", 1))
443
+ end
422
444
  end
@@ -0,0 +1,32 @@
1
+ $: << ".." << "../lib"
2
+ require 'rcodetools/options'
3
+ require 'test/unit'
4
+ require 'tmpdir'
5
+ require 'fileutils'
6
+
7
+ class TestOptionHandler < Test::Unit::TestCase
8
+ include OptionHandler
9
+
10
+ def include_paths_check
11
+ options = { :include_paths => [] }
12
+ auto_include_paths options[:include_paths], Dir.pwd
13
+ assert options[:include_paths].include?("#{@basedir}/lib")
14
+ assert options[:include_paths].include?("#{@basedir}/bin")
15
+ end
16
+
17
+ def test_auto_include_paths
18
+ Dir.chdir(Dir.tmpdir) do
19
+ begin
20
+ FileUtils.mkdir_p ["project", "project/lib/project", "project/bin", "project/share"]
21
+ open("project/Rakefile","w"){}
22
+ @basedir = File.expand_path "project"
23
+ Dir.chdir("project/lib/project/") { include_paths_check }
24
+ Dir.chdir("project/lib/") { include_paths_check }
25
+ Dir.chdir("project/bin/") { include_paths_check }
26
+ Dir.chdir("project/") { include_paths_check }
27
+ ensure
28
+ FileUtils.rm_rf "project"
29
+ end
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rcodetools
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.1.0
7
- date: 2007-01-13 00:00:00 +01:00
6
+ version: 0.5.0.0
7
+ date: 2007-01-28 00:00:00 +01:00
8
8
  summary: rcodetools is a collection of Ruby code manipulation tools
9
9
  require_paths:
10
10
  - lib
@@ -76,6 +76,7 @@ files:
76
76
  - test/test_method_args.rb
77
77
  - test/test_method_analyzer.rb
78
78
  - test/test_run.rb
79
+ - test/test_options.rb
79
80
  - test/data/simple_annotation-input.rb
80
81
  - test/data/unit_test-input.rb
81
82
  - test/data/rspec-input.rb
@@ -119,6 +120,7 @@ test_files:
119
120
  - test/test_method_args.rb
120
121
  - test/test_method_analyzer.rb
121
122
  - test/test_run.rb
123
+ - test/test_options.rb
122
124
  rdoc_options:
123
125
  - --main
124
126
  - README