Revision: 4415 http://trac.macosforge.org/projects/ruby/changeset/4415 Author: eloy.de.enige@gmail.com Date: 2010-08-06 16:48:44 -0700 (Fri, 06 Aug 2010) Log Message: ----------- Update DietRB to HEAD 7366450743a2a7b482b576c88dafa96d069b7941 Modified Paths: -------------- MacRuby/trunk/lib/irb/ext/completion.rb MacRuby/trunk/lib/irb/source.rb MacRuby/trunk/spec/dietrb/ext/completion_spec.rb MacRuby/trunk/spec/dietrb/source_spec.rb Modified: MacRuby/trunk/lib/irb/ext/completion.rb =================================================================== --- MacRuby/trunk/lib/irb/ext/completion.rb 2010-08-06 20:57:20 UTC (rev 4414) +++ MacRuby/trunk/lib/irb/ext/completion.rb 2010-08-06 23:48:44 UTC (rev 4415) @@ -59,6 +59,14 @@ evaluate('local_variables').map(&:to_s) end + def instance_variables + context.object.instance_variables.map(&:to_s) + end + + def global_variables + super.map(&:to_s) + end + def instance_methods context.object.methods.map(&:to_s) end @@ -106,7 +114,13 @@ end if call - format_methods(receiver, methods || methods_of_object(root), filter) + if results = (methods || methods_of_object(root)) + format_methods(receiver, results, filter) + else + # this is mainly because MacRuby currently has a problem with local_variables, + # normally I'd prefer to let the program die so the user might report it + [] + end else match_methods_vars_or_consts_in_scope(root) end.sort.uniq @@ -129,8 +143,10 @@ case var[TYPE] when :@ident local_variables + instance_methods + RESERVED_DOWNCASE_WORDS + when :@ivar + instance_variables when :@gvar - global_variables.map(&:to_s) + global_variables when :@const if symbol[TYPE] == :top_const_ref filter = "::#{filter}" @@ -174,8 +190,10 @@ case type when :@ident evaluate(name).methods if local_variables.include?(name) + when :@ivar + evaluate(name).methods if instance_variables.include?(name) when :@gvar - eval(name).methods if global_variables.include?(name.to_sym) + eval(name).methods if global_variables.include?(name) when :@const evaluate(name).methods if constants.include?(name) end Modified: MacRuby/trunk/lib/irb/source.rb =================================================================== --- MacRuby/trunk/lib/irb/source.rb 2010-08-06 20:57:20 UTC (rev 4414) +++ MacRuby/trunk/lib/irb/source.rb 2010-08-06 23:48:44 UTC (rev 4415) @@ -72,7 +72,7 @@ def initialize(source) super @level = 0 - @code_block = !parse.nil? + @code_block = !parse.nil? && !@in_string && !@in_regexp && !@in_array end # Returns the code block indentation level. @@ -183,6 +183,65 @@ @level -= 1 super end + + def on_tstring_beg(token) + @in_string = token + @level += 1 + super + end + + def on_tstring_end(token) + if @in_string && tokens_match?(@in_string, token) + @in_string = nil + @level -= 1 + end + super + end + + def on_qwords_beg(token) + @in_array = token.strip + @level += 1 + super + end + alias_method :on_words_beg, :on_qwords_beg + + def on_words_sep(token) + if tokens_match?(@in_array, token) + @in_array = false + @level -= 1 + end + super + end + + def on_regexp_beg(token) + @in_regexp = token + @level += 1 + super + end + + def on_regexp_end(token) + if tokens_match?(@in_regexp, token) + @in_regexp = false + @level -= 1 + end + super + end + + def tokens_match?(open_token, close_token) + last_char_open_token = open_token[-1, 1] + last_char_close_token = close_token[-1, 1] + if last_char_open_token == last_char_close_token + true + else + case last_char_open_token + when '{' then last_char_close_token == '}' + when '(' then last_char_close_token == ')' + when '[' then last_char_close_token == ']' + else + false + end + end + end end end end Modified: MacRuby/trunk/spec/dietrb/ext/completion_spec.rb =================================================================== --- MacRuby/trunk/spec/dietrb/ext/completion_spec.rb 2010-08-06 20:57:20 UTC (rev 4414) +++ MacRuby/trunk/spec/dietrb/ext/completion_spec.rb 2010-08-06 23:48:44 UTC (rev 4415) @@ -58,6 +58,11 @@ complete('foo.').should include('foo.singleton_method') end + it "matches as an instance variable" do + @context.__evaluate__('@an_instance_variable = ::CompletionStub.new') + complete('@an_instance_variable.').should == imethods(::CompletionStub, '@an_instance_variable') + end + it "matches as a global variable" do complete('$a_completion_stub.').should == imethods(::CompletionStub, '$a_completion_stub') end @@ -193,9 +198,10 @@ end it "filters the methods, of the variable receiver, by the given method name" do - @context.__evaluate__('foo = ::CompletionStub.new') + @context.__evaluate__('foo = @an_instance_variable = ::CompletionStub.new') complete('foo.an_im').should == %w{ foo.an_imethod } complete('$a_completion_stub.an_im').should == %w{ $a_completion_stub.an_imethod } + complete('@an_instance_variable.an_im').should == %w{ @an_instance_variable.an_imethod } # TODO: fix # complete('CompletionStub.a_sing').should == %w{ CompletionStub.a_singleton_method } end @@ -204,7 +210,7 @@ describe "when *not* doing a method call on an explicit receiver" do before do - @context.__evaluate__("a_local_variable = :ok") + @context.__evaluate__("a_local_variable = @an_instance_variable = :ok") end it "matches local variables" do @@ -219,6 +225,10 @@ complete("a_loc").should == %w{ a_local_method a_local_variable } end + it "matches instance variables" do + complete("@an_inst").should == %w{ @an_instance_variable } + end + it "matches global variables" do complete("$a_completion_s").should == %w{ $a_completion_stub } end Modified: MacRuby/trunk/spec/dietrb/source_spec.rb =================================================================== --- MacRuby/trunk/spec/dietrb/source_spec.rb 2010-08-06 20:57:20 UTC (rev 4414) +++ MacRuby/trunk/spec/dietrb/source_spec.rb 2010-08-06 23:48:44 UTC (rev 4415) @@ -140,11 +140,14 @@ it "returns whether or not the source contains a syntax error, except a code block not ending" do reflect("def;").syntax_error?.should == true reflect("def;").syntax_error?.should == true + reflect("{ [ } ]").syntax_error?.should == true reflect("def foo").syntax_error?.should == false reflect("class A; }").syntax_error?.should == true reflect("class A; {" ).syntax_error?.should == false + reflect("class A; def {").syntax_error?.should == true reflect("class A def foo").syntax_error?.should == true reflect("class A; def foo" ).syntax_error?.should == false + reflect("def foo; {; end; }").syntax_error?.should == true end it "returns the actual syntax error message if one occurs" do @@ -185,12 +188,68 @@ it "correctly increases and decreases the code block indentation level for literals" do [ ["lambda { |x|", "}"], - ["{", "}"], - ['"#{', '}"'], - ["[", "]"] + ["{ :foo => ", " :bar }"], + ["[ 1", ", 2 ]"], + + ["'", "'"], + ["' ", " '"], + ["'foo ", " bar'"], + ["' foo ", " bar '"], + + ['"', '"'], + ['" ', ' "'], + ['"foo ', ' bar"'], + ['" foo ', ' bar "'], + + ["%{", "}"], + ["%{ ", " }"], + ["%{foo ", " bar}"], + ["%{ foo ", " bar }"], + ["%(foo ", " bar)"], + ["%( foo ", " bar )"], + ["%[ foo ", " bar ]"], + ["%[foo ", " bar]"], + + ["%w{ ", " }"], + ["%w{foo ", " bar}"], + ["%w{ foo ", " bar }"], + ["%w(foo ", " bar)"], + ["%w( foo ", " bar )"], + ["%w[foo ", " bar]"], + ["%w[ foo ", " bar ]"], + + ["%W{foo ", " bar}"], + ["%W{ foo ", " bar }"], + ["%W(foo ", " bar)"], + ["%W( foo ", " bar )"], + ["%W[foo ", " bar]"], + ["%W[ foo ", " bar ]"], + + ["%r{foo ", " bar}"], + ["%r{ foo ", " bar }"], + ["%r(foo ", " bar)"], + ["%r( foo ", " bar )"], + ["%r[foo ", " bar]"], + ["%r[ foo ", " bar ]"], + + ["/foo ", " bar/"], + ["/ foo ", " bar /"], ].each do |open, close| reflect(open).level.should == 1 + reflect(open).code_block?.should == false reflect("#{open}\n#{close}").level.should == 0 + reflect("#{open}\n#{close}").code_block?.should == true end end + + it "handles cases that contain backspaces" do + [ + ["%{", "\b"], + ["%w{", "\b"], + ["%r{", "\b"], + ].each do |open, close| + reflect("#{open}\n#{close}").level.should == 1 + reflect("#{open}\n#{close}").code_block?.should == false + end + end end
participants (1)
-
source_changes@macosforge.org