[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