diff --git a/lib/ruby.rb b/lib/ruby.rb index 2882f077..737f765d 100644 --- a/lib/ruby.rb +++ b/lib/ruby.rb @@ -21,7 +21,7 @@ require_relative "ruby/while_statement" require_relative "ruby/basic_values" require_relative "ruby/hash_statement" require_relative "ruby/method_statement" -require_relative "ruby/ruby_compiler" +require_relative "ruby/class_method_statement" require_relative "ruby/call_statement" require_relative "ruby/send_statement" require_relative "ruby/yield_statement" diff --git a/lib/ruby/class_method_statement.rb b/lib/ruby/class_method_statement.rb new file mode 100644 index 00000000..93ea89cd --- /dev/null +++ b/lib/ruby/class_method_statement.rb @@ -0,0 +1,14 @@ +module Ruby + class ClassMethodStatement < MethodStatement + + def to_vool +# Vool::ClassMethodStatement.new( @name , @args.dup , @body.to_vool) + end + + def to_s(depth = 0) + arg_str = @args.collect{|a| a.to_s}.join(', ') + at_depth(depth , "def self.#{name}(#{arg_str})" , @body.to_s(depth + 1) , "end") + end + + end +end diff --git a/lib/ruby/ruby_compiler.rb b/lib/ruby/ruby_compiler.rb index f352aa32..37d20e26 100644 --- a/lib/ruby/ruby_compiler.rb +++ b/lib/ruby/ruby_compiler.rb @@ -54,6 +54,13 @@ module Ruby MethodStatement.new( name , arg_array , process(body) ) end + def on_defs( statement ) + me , name , args , body = *statement + raise "only class method implemented, not #{me.type}" unless me.type == :self + arg_array = process_all( args ) + ClassMethodStatement.new( name , arg_array , process(body) ) + end + def on_arg( arg ) arg.first end diff --git a/lib/vool/class_statement.rb b/lib/vool/class_statement.rb index d7d76be1..049392bb 100644 --- a/lib/vool/class_statement.rb +++ b/lib/vool/class_statement.rb @@ -38,6 +38,9 @@ module Vool #existing class, don't overwrite type (parfait only?) else @clazz = Parfait.object_space.create_class(@name , @super_class_name ) + #TODO this should start from Object Type and add one name at a time. + # So the "trail" of types leading to this one exists. + # Also the Class always has a valid type. ivar_hash = {} self.each do |node| next unless node.is_a?(InstanceVariable) or node.is_a?(IvarAssignment) diff --git a/test/ruby/test_method_statement.rb b/test/ruby/test_method_statement.rb index 376b51c6..035878a1 100644 --- a/test/ruby/test_method_statement.rb +++ b/test/ruby/test_method_statement.rb @@ -53,4 +53,18 @@ module Ruby assert_equal LocalAssignment , lst.body.class end end + class TestClassMethodStatement < MiniTest::Test + include RubyTests + + def test_basic_method + input = "def self.tryout() ; return true ; end " + @lst = compile( input ) + assert_equal Ruby::ClassMethodStatement , @lst.class + end + def test_method_arg + input = "def self.tryout(arg) ; arg = true ; return arg ; end " + @lst = compile( input ) + assert_equal Ruby::ClassMethodStatement , @lst.class + end + end end