Skip to content

Commit

Permalink
add iter support
Browse files Browse the repository at this point in the history
  • Loading branch information
rkh committed Aug 30, 2011
1 parent 11481e6 commit 208c5ba
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 4 deletions.
1 change: 1 addition & 0 deletions lib/reak/bootstrap/ast.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module AST
require 'reak/bootstrap/ast/string' require 'reak/bootstrap/ast/string'
require 'reak/bootstrap/ast/constant_access' require 'reak/bootstrap/ast/constant_access'
require 'reak/bootstrap/ast/scoped_constant' require 'reak/bootstrap/ast/scoped_constant'
require 'reak/bootstrap/ast/iter'
require 'reak/bootstrap/ast/keyword_send' require 'reak/bootstrap/ast/keyword_send'
require 'reak/bootstrap/ast/block' require 'reak/bootstrap/ast/block'


Expand Down
15 changes: 15 additions & 0 deletions lib/reak/bootstrap/ast/iter.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,15 @@
module Reak
module AST
class Iter < Rubinius::AST::Iter
include Reak::AST::Node

def self.bootstrap_grammar(g)
g.seq("[", g.t(:block), "]")
end

def self.action(body)
new 1, nil, body
end
end
end
end
10 changes: 6 additions & 4 deletions lib/reak/bootstrap/ast/keyword_send.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -11,19 +11,21 @@ def self.method_and_args(*pairs)
def self.bootstrap_grammar(g) def self.bootstrap_grammar(g)
g.key_value_pair = g.seq(g.t(:identifier), ":", :sp, g.t(:primary), :sp) { |k,v| [k, v] } g.key_value_pair = g.seq(g.t(:identifier), ":", :sp, g.t(:primary), :sp) { |k,v| [k, v] }
g.keyword_send_args = g.many(:key_value_pair) { |*p| method_and_args(*p) } g.keyword_send_args = g.many(:key_value_pair) { |*p| method_and_args(*p) }
g.seq(receiver_rule, :sp, :keyword_send_args) g.seq(receiver_rule, :sp, :keyword_send_args, g.maybe(:iter))
end end


def self.action(receiver, _, method_and_args) def self.action(receiver, _, method_and_args, iter)
new(1, receiver, *method_and_args) method, args = method_and_args
new(1, receiver, method, args, *iter)
end end


def self.receiver_rule def self.receiver_rule
:primary :primary
end end


def initialize(line, receiver, name, arguments) def initialize(line, receiver, name, arguments, block = nil)
super line, receiver, Reak.smalltalk_prefix(name), nil, true super line, receiver, Reak.smalltalk_prefix(name), nil, true
@block = block
@arguments.array.concat arguments @arguments.array.concat arguments
end end


Expand Down
29 changes: 29 additions & 0 deletions test/bootstrap/ast/iter_test.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,29 @@
require File.expand_path('../../test_helper', __FILE__)
MiniTest::Unit.autorun if $0 == __FILE__

class ASTIterTest < MiniTest::Unit::TestCase
include LiteralTest
literal Reak::AST::Iter

module Something
@value = nil

def self.value
@value
end

def self.set_value(value)
@value = value
yield
end

Reak.smalltalk_expose singleton_class, 'set_value', 'setValue:'
end

parses "'foo' bar: 'baz' [ 'blah' ]"

evaluates("ASTIterTest.Something setValue: 'foo' [ 'ok' ]") do |return_value|
assert_equal "ok", return_value
assert_equal "foo", Something.value
end
end

0 comments on commit 208c5ba

Please sign in to comment.