OSDN Git Service

FIRST REPOSITORY
[eos/hostdependOTHERS.git] / I386LINUX / util / I386LINUX / lib / ruby / 1.6 / irb / completion.rb
1 #
2 #   irb/completor.rb - 
3 #       $Release Version: 0.7.1$
4 #       $Revision: 1.1.1.1 $
5 #       $Date: 2002/02/01 06:36:22 $
6 #       by Keiju ISHITSUKA(keiju@ishitsuka.com)
7 #       From Original Idea of shugo@ruby-lang.org
8 #
9
10 require "readline"
11
12 module IRB
13   module InputCompletor
14
15     @RCS_ID='-$Id: completion.rb,v 1.1.1.1 2002/02/01 06:36:22 tacyas Exp $-'
16
17     ReservedWords = [
18       "BEGIN", "END",
19       "alias", "and", 
20       "begin", "break", 
21       "case", "class",
22       "def", "defined", "do",
23       "else", "elsif", "end", "ensure",
24       "false", "for", 
25       "if", "in", 
26       "module", 
27       "next", "nil", "not",
28       "or", 
29       "redo", "rescue", "retry", "return",
30       "self", "super",
31       "then", "true",
32       "undef", "unless", "until",
33       "when", "while",
34       "yield",
35     ]
36       
37     CompletionProc = proc { |input|
38       bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
39       case input
40       when /^(\/[^\/]*\/)\.([^.]*)$/
41         # Regexp
42         receiver = $1
43         message = Regexp.quote($2)
44
45         candidates = Regexp.instance_methods(true)
46         select_message(receiver, message, candidates)
47
48       when /^([^\]]*\])\.([^.]*)$/
49         # Array
50         receiver = $1
51         message = Regexp.quote($2)
52
53         candidates = Array.instance_methods(true)
54         select_message(receiver, message, candidates)
55
56       when /^([^\}]*\})\.([^.]*)$/
57         # Proc or Hash
58         receiver = $1
59         message = Regexp.quote($2)
60
61         candidates = Proc.instance_methods(true) | Hash.instance_methods(true)
62         select_message(receiver, message, candidates)
63         
64       when /^(:[^:]*)$/
65         # Symbol
66         if Symbol.respond_to?(:all_symbols)
67           sym = $1
68           candidates = Symbol.all_symbols.collect{|s| s.id2name}
69           candidates.grep(/^#{sym}/)
70         else
71           []
72         end
73
74       when /^::([A-Z][^:\.\(]*)$/
75         # Absolute Constant or class methods
76         receiver = $1
77         candidates = Object.constants
78         candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
79
80       when /^(((::)?[A-Z][^:.\(]*)+)::?([^:.]*)$/
81         # Constant or class methods
82         receiver = $1
83         message = Regexp.quote($4)
84         begin
85           candidates = eval("#{receiver}.constants | #{receiver}.methods", bind)
86         rescue Exception
87           candidates = []
88         end
89         candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
90
91       when /^(:[^.]+)\.([^.]*)$/
92         # Symbol
93         receiver = $1
94         message = Regexp.quote($2)
95
96         candidates = Symbol.instance_methods(true)
97         select_message(receiver, message, candidates)
98
99       when /^([0-9_]+(\.[0-9_]+)?(e[0-9]+)?)\.([^.]*)$/
100         # Numeric
101         receiver = $1
102         message = Regexp.quote($4)
103
104         begin
105           candidates = eval(receiver, bind).methods
106         rescue Exception
107           candidates
108         end
109         select_message(receiver, message, candidates)
110
111 #      when /^(\$?(\.?[^.]+)+)\.([^.]*)$/
112       when /^((\.?[^.]+)+)\.([^.]*)$/
113         # variable
114         receiver = $1
115         message = Regexp.quote($3)
116
117         gv = eval "global_variables", bind
118         lv = eval "local_variables", bind
119         cv = eval "type.constants", bind
120         
121         if (gv | lv | cv).include?(receiver)
122           # foo.func and foo is local var.
123           candidates = eval("#{receiver}.methods", bind)
124         elsif /^[A-Z]/ =~ receiver and /\./ !~ receiver
125           # Foo::Bar.func
126           begin
127             candidates = eval("#{receiver}.methods", bind)
128           rescue Exception
129             candidates = []
130           end
131         else
132           # func1.func2
133           candidates = []
134           ObjectSpace.each_object(Module){|m|
135             next if /^(IRB|SLex|RubyLex|RubyToken)/ =~ m.name
136             candidates.concat m.instance_methods
137           }
138           candidates.sort!
139           candidates.uniq!
140         end
141         select_message(receiver, message, candidates)
142
143       when /^\.([^.]*)$/
144         # unknown(maybe String)
145
146         receiver = ""
147         message = Regexp.quote($1)
148
149         candidates = String.instance_methods(true)
150         select_message(receiver, message, candidates)
151
152       else
153         candidates = eval("methods | private_methods | local_variables | type.constants", bind)
154                           
155         (candidates|ReservedWords).grep(/^#{Regexp.quote(input)}/)
156       end
157     }
158
159     Operators = ["%", "&", "*", "**", "+",  "-",  "/",
160       "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
161       "[]", "[]=", "^",]
162
163     def self.select_message(receiver, message, candidates)
164       candidates.grep(/^#{message}/).collect do |e|
165         case e
166         when /^[a-zA-Z_]/
167           receiver + "." + e
168         when /^[0-9]/
169         when *Operators
170           #receiver + " " + e
171         end
172       end
173     end
174   end
175 end
176
177 Readline.completion_proc = IRB::InputCompletor::CompletionProc