1 | #
|
---|
2 | # irb/context.rb - irb context
|
---|
3 | # $Release Version: 0.9.5$
|
---|
4 | # $Revision: 11708 $
|
---|
5 | # $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
|
---|
6 | # by Keiju ISHITSUKA([email protected])
|
---|
7 | #
|
---|
8 | # --
|
---|
9 | #
|
---|
10 | #
|
---|
11 | #
|
---|
12 | require "irb/workspace"
|
---|
13 |
|
---|
14 | module IRB
|
---|
15 | class Context
|
---|
16 | #
|
---|
17 | # Arguments:
|
---|
18 | # input_method: nil -- stdin or readline
|
---|
19 | # String -- File
|
---|
20 | # other -- using this as InputMethod
|
---|
21 | #
|
---|
22 | def initialize(irb, workspace = nil, input_method = nil, output_method = nil)
|
---|
23 | @irb = irb
|
---|
24 | if workspace
|
---|
25 | @workspace = workspace
|
---|
26 | else
|
---|
27 | @workspace = WorkSpace.new
|
---|
28 | end
|
---|
29 | @thread = Thread.current if defined? Thread
|
---|
30 | # @irb_level = 0
|
---|
31 |
|
---|
32 | # copy of default configuration
|
---|
33 | @ap_name = IRB.conf[:AP_NAME]
|
---|
34 | @rc = IRB.conf[:RC]
|
---|
35 | @load_modules = IRB.conf[:LOAD_MODULES]
|
---|
36 |
|
---|
37 | @use_readline = IRB.conf[:USE_READLINE]
|
---|
38 | @inspect_mode = IRB.conf[:INSPECT_MODE]
|
---|
39 |
|
---|
40 | self.math_mode = IRB.conf[:MATH_MODE] if IRB.conf[:MATH_MODE]
|
---|
41 | self.use_tracer = IRB.conf[:USE_TRACER] if IRB.conf[:USE_TRACER]
|
---|
42 | self.use_loader = IRB.conf[:USE_LOADER] if IRB.conf[:USE_LOADER]
|
---|
43 | self.eval_history = IRB.conf[:EVAL_HISTORY] if IRB.conf[:EVAL_HISTORY]
|
---|
44 |
|
---|
45 | @ignore_sigint = IRB.conf[:IGNORE_SIGINT]
|
---|
46 | @ignore_eof = IRB.conf[:IGNORE_EOF]
|
---|
47 |
|
---|
48 | @back_trace_limit = IRB.conf[:BACK_TRACE_LIMIT]
|
---|
49 |
|
---|
50 | self.prompt_mode = IRB.conf[:PROMPT_MODE]
|
---|
51 |
|
---|
52 | if IRB.conf[:SINGLE_IRB] or !defined?(JobManager)
|
---|
53 | @irb_name = IRB.conf[:IRB_NAME]
|
---|
54 | else
|
---|
55 | @irb_name = "irb#"+IRB.JobManager.n_jobs.to_s
|
---|
56 | end
|
---|
57 | @irb_path = "(" + @irb_name + ")"
|
---|
58 |
|
---|
59 | case input_method
|
---|
60 | when nil
|
---|
61 | case use_readline?
|
---|
62 | when nil
|
---|
63 | if (defined?(ReadlineInputMethod) && STDIN.tty? &&
|
---|
64 | IRB.conf[:PROMPT_MODE] != :INF_RUBY)
|
---|
65 | @io = ReadlineInputMethod.new
|
---|
66 | else
|
---|
67 | @io = StdioInputMethod.new
|
---|
68 | end
|
---|
69 | when false
|
---|
70 | @io = StdioInputMethod.new
|
---|
71 | when true
|
---|
72 | if defined?(ReadlineInputMethod)
|
---|
73 | @io = ReadlineInputMethod.new
|
---|
74 | else
|
---|
75 | @io = StdioInputMethod.new
|
---|
76 | end
|
---|
77 | end
|
---|
78 |
|
---|
79 | when String
|
---|
80 | @io = FileInputMethod.new(input_method)
|
---|
81 | @irb_name = File.basename(input_method)
|
---|
82 | @irb_path = input_method
|
---|
83 | else
|
---|
84 | @io = input_method
|
---|
85 | end
|
---|
86 | self.save_history = IRB.conf[:SAVE_HISTORY] if IRB.conf[:SAVE_HISTORY]
|
---|
87 |
|
---|
88 | if output_method
|
---|
89 | @output_method = output_method
|
---|
90 | else
|
---|
91 | @output_method = StdioOutputMethod.new
|
---|
92 | end
|
---|
93 |
|
---|
94 | @verbose = IRB.conf[:VERBOSE]
|
---|
95 | @echo = IRB.conf[:ECHO]
|
---|
96 | if @echo.nil?
|
---|
97 | @echo = true
|
---|
98 | end
|
---|
99 | @debug_level = IRB.conf[:DEBUG_LEVEL]
|
---|
100 | end
|
---|
101 |
|
---|
102 | def main
|
---|
103 | @workspace.main
|
---|
104 | end
|
---|
105 |
|
---|
106 | attr_reader :workspace_home
|
---|
107 | attr_accessor :workspace
|
---|
108 | attr_reader :thread
|
---|
109 | attr_accessor :io
|
---|
110 |
|
---|
111 | attr_accessor :irb
|
---|
112 | attr_accessor :ap_name
|
---|
113 | attr_accessor :rc
|
---|
114 | attr_accessor :load_modules
|
---|
115 | attr_accessor :irb_name
|
---|
116 | attr_accessor :irb_path
|
---|
117 |
|
---|
118 | attr_reader :use_readline
|
---|
119 | attr_reader :inspect_mode
|
---|
120 |
|
---|
121 | attr_reader :prompt_mode
|
---|
122 | attr_accessor :prompt_i
|
---|
123 | attr_accessor :prompt_s
|
---|
124 | attr_accessor :prompt_c
|
---|
125 | attr_accessor :prompt_n
|
---|
126 | attr_accessor :auto_indent_mode
|
---|
127 | attr_accessor :return_format
|
---|
128 |
|
---|
129 | attr_accessor :ignore_sigint
|
---|
130 | attr_accessor :ignore_eof
|
---|
131 | attr_accessor :echo
|
---|
132 | attr_accessor :verbose
|
---|
133 | attr_reader :debug_level
|
---|
134 |
|
---|
135 | attr_accessor :back_trace_limit
|
---|
136 |
|
---|
137 | alias use_readline? use_readline
|
---|
138 | alias rc? rc
|
---|
139 | alias ignore_sigint? ignore_sigint
|
---|
140 | alias ignore_eof? ignore_eof
|
---|
141 | alias echo? echo
|
---|
142 |
|
---|
143 | def verbose?
|
---|
144 | if @verbose.nil?
|
---|
145 | if defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
|
---|
146 | false
|
---|
147 | elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
|
---|
148 | true
|
---|
149 | else
|
---|
150 | false
|
---|
151 | end
|
---|
152 | end
|
---|
153 | end
|
---|
154 |
|
---|
155 | def prompting?
|
---|
156 | verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
|
---|
157 | (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
|
---|
158 | end
|
---|
159 |
|
---|
160 | attr_reader :last_value
|
---|
161 |
|
---|
162 | def set_last_value(value)
|
---|
163 | @last_value = value
|
---|
164 | @workspace.evaluate self, "_ = IRB.CurrentContext.last_value"
|
---|
165 | end
|
---|
166 |
|
---|
167 | attr_reader :irb_name
|
---|
168 |
|
---|
169 | def prompt_mode=(mode)
|
---|
170 | @prompt_mode = mode
|
---|
171 | pconf = IRB.conf[:PROMPT][mode]
|
---|
172 | @prompt_i = pconf[:PROMPT_I]
|
---|
173 | @prompt_s = pconf[:PROMPT_S]
|
---|
174 | @prompt_c = pconf[:PROMPT_C]
|
---|
175 | @prompt_n = pconf[:PROMPT_N]
|
---|
176 | @return_format = pconf[:RETURN]
|
---|
177 | if ai = pconf.include?(:AUTO_INDENT)
|
---|
178 | @auto_indent_mode = ai
|
---|
179 | else
|
---|
180 | @auto_indent_mode = IRB.conf[:AUTO_INDENT]
|
---|
181 | end
|
---|
182 | end
|
---|
183 |
|
---|
184 | def inspect?
|
---|
185 | @inspect_mode.nil? or @inspect_mode
|
---|
186 | end
|
---|
187 |
|
---|
188 | def file_input?
|
---|
189 | @io.class == FileInputMethod
|
---|
190 | end
|
---|
191 |
|
---|
192 | def inspect_mode=(opt)
|
---|
193 | if opt
|
---|
194 | @inspect_mode = opt
|
---|
195 | else
|
---|
196 | @inspect_mode = !@inspect_mode
|
---|
197 | end
|
---|
198 | print "Switch to#{unless @inspect_mode; ' non';end} inspect mode.\n" if verbose?
|
---|
199 | @inspect_mode
|
---|
200 | end
|
---|
201 |
|
---|
202 | def use_readline=(opt)
|
---|
203 | @use_readline = opt
|
---|
204 | print "use readline module\n" if @use_readline
|
---|
205 | end
|
---|
206 |
|
---|
207 | def debug_level=(value)
|
---|
208 | @debug_level = value
|
---|
209 | RubyLex.debug_level = value
|
---|
210 | SLex.debug_level = value
|
---|
211 | end
|
---|
212 |
|
---|
213 | def debug?
|
---|
214 | @debug_level > 0
|
---|
215 | end
|
---|
216 |
|
---|
217 | def evaluate(line, line_no)
|
---|
218 | @line_no = line_no
|
---|
219 | set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
|
---|
220 | # @workspace.evaluate("_ = IRB.conf[:MAIN_CONTEXT]._")
|
---|
221 | # @_ = @workspace.evaluate(line, irb_path, line_no)
|
---|
222 | end
|
---|
223 |
|
---|
224 | alias __exit__ exit
|
---|
225 | def exit(ret = 0)
|
---|
226 | IRB.irb_exit(@irb, ret)
|
---|
227 | end
|
---|
228 |
|
---|
229 | NOPRINTING_IVARS = ["@last_value"]
|
---|
230 | NO_INSPECTING_IVARS = ["@irb", "@io"]
|
---|
231 | IDNAME_IVARS = ["@prompt_mode"]
|
---|
232 |
|
---|
233 | alias __inspect__ inspect
|
---|
234 | def inspect
|
---|
235 | array = []
|
---|
236 | for ivar in instance_variables.sort{|e1, e2| e1 <=> e2}
|
---|
237 | name = ivar.sub(/^@(.*)$/){$1}
|
---|
238 | val = instance_eval(ivar)
|
---|
239 | case ivar
|
---|
240 | when *NOPRINTING_IVARS
|
---|
241 | array.push format("conf.%s=%s", name, "...")
|
---|
242 | when *NO_INSPECTING_IVARS
|
---|
243 | array.push format("conf.%s=%s", name, val.to_s)
|
---|
244 | when *IDNAME_IVARS
|
---|
245 | array.push format("conf.%s=:%s", name, val.id2name)
|
---|
246 | else
|
---|
247 | array.push format("conf.%s=%s", name, val.inspect)
|
---|
248 | end
|
---|
249 | end
|
---|
250 | array.join("\n")
|
---|
251 | end
|
---|
252 | alias __to_s__ to_s
|
---|
253 | alias to_s inspect
|
---|
254 | end
|
---|
255 | end
|
---|