[macruby-changes] [4595] DietRB/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Fri Oct 8 03:45:58 PDT 2010
Revision: 4595
http://trac.macosforge.org/projects/ruby/changeset/4595
Author: eloy.de.enige at gmail.com
Date: 2010-10-08 03:45:56 -0700 (Fri, 08 Oct 2010)
Log Message:
-----------
Add IRB::Source::Reflector which returns the code block indentation.
From: Eloy Duran <eloy.de.enige at gmail.com>
Modified Paths:
--------------
DietRB/trunk/lib/irb/source.rb
DietRB/trunk/spec/source_spec.rb
Modified: DietRB/trunk/lib/irb/source.rb
===================================================================
--- DietRB/trunk/lib/irb/source.rb 2010-10-08 10:45:48 UTC (rev 4594)
+++ DietRB/trunk/lib/irb/source.rb 2010-10-08 10:45:56 UTC (rev 4595)
@@ -2,6 +2,28 @@
module IRB
class Source
+ class Reflector < Ripper::SexpBuilder
+ def initialize(source)
+ super
+ @level = 0
+ end
+
+ def level
+ parse
+ @level
+ end
+
+ def on_kw(token)
+ case token
+ when "class", "def"
+ @level += 1
+ when "end"
+ @level -= 1
+ end
+ super
+ end
+ end
+
attr_reader :buffer
def initialize(buffer = [])
@@ -16,6 +38,10 @@
@buffer.join("\n")
end
+ def level
+ Reflector.new(source).level
+ end
+
# This does not take syntax errors in account, but only whether or not the
# accumulated source up till now is a valid code block.
#
@@ -27,7 +53,7 @@
#
# def foo; p :ok; end
def valid?
- !!Ripper::SexpBuilder.new(source).parse
+ !!Reflector.new(source).parse
end
end
end
\ No newline at end of file
Modified: DietRB/trunk/spec/source_spec.rb
===================================================================
--- DietRB/trunk/spec/source_spec.rb 2010-10-08 10:45:48 UTC (rev 4594)
+++ DietRB/trunk/spec/source_spec.rb 2010-10-08 10:45:56 UTC (rev 4595)
@@ -46,4 +46,42 @@
IRB::Source.new(buffer).should.not.be.valid
end
end
+
+ it "returns the current code block indentation level" do
+ @source.level.should == 0
+ @source << "class A"
+ @source.level.should == 1
+ @source << " def foo"
+ @source.level.should == 2
+ @source << " p :ok"
+ @source.level.should == 2
+ @source << " end"
+ @source.level.should == 1
+ @source << " class B"
+ @source.level.should == 2
+ @source << " def bar"
+ @source.level.should == 3
+ @source << " p :ok; end"
+ @source.level.should == 2
+ @source << " end; end"
+ @source.level.should == 0
+ end
+end
+
+describe "IRB::Source::Reflector" do
+ def level(source)
+ IRB::Source::Reflector.new(source).level
+ end
+
+ it "returns the code block indentation level" do
+ level("").should == 0
+ level("class A").should == 1
+ level("class A; def foo").should == 2
+ level("class A; def foo; p :ok").should == 2
+ level("class A; def foo; p :ok; end").should == 1
+ level("class A; class B").should == 2
+ level("class A; class B; def bar").should == 3
+ level("class A; class B; def bar; p :ok; end").should == 2
+ level("class A; class B; def bar; p :ok; end; end; end").should == 0
+ end
end
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101008/6ccea1b7/attachment.html>
More information about the macruby-changes
mailing list