diff --git a/lib/parfait/meta_class.rb b/lib/parfait/meta_class.rb index f2948855..f3f25de4 100644 --- a/lib/parfait/meta_class.rb +++ b/lib/parfait/meta_class.rb @@ -41,11 +41,6 @@ module Parfait "MetaClass(#{clazz.name})" end - # no superclass, return nil to signal - def super_class_name - nil - end - def add_method_for(name , type , frame , body ) method = Parfait::VoolMethod.new(name , type , frame , body ) add_method( method ) @@ -73,35 +68,15 @@ module Parfait self.instance_type = type end - # return the super class, but raise exception if either the super class name - # or the super classs is nil. - # Use only for non Object base class - def super_class! - raise "No super_class for class #{name}" unless super_class_name - s = super_class - raise "superclass not found for class #{name} (#{super_class_name})" unless s - s - end - - # return the super class - # we only store the name, and so have to resolve. - # Nil name means no superclass, and so nil is a valid return value + # Nil name means no superclass, and so nil returned def super_class - return nil unless super_class_name - Parfait.object_space.get_class_by_name(super_class_name) + return nil end - # ruby 2.1 list (just for reference, keep at bottom) - #:allocate, :new, :superclass - - # + modules - # :<, :<=, :>, :>=, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_instance_methods, - # :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?, - # :const_missing, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, - # :class_variable_defined?, :public_constant, :private_constant, :singleton_class?, :include, :prepend, - # :module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?, - # :private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method, :autoload, - # :autoload?, :instance_method, :public_instance_method + # no superclass, return nil to signal + def super_class_name + nil + end end end diff --git a/lib/vool/class_method_statement.rb b/lib/vool/class_method_statement.rb index 5737058d..916d6989 100644 --- a/lib/vool/class_method_statement.rb +++ b/lib/vool/class_method_statement.rb @@ -8,6 +8,7 @@ module Vool end def to_mom(clazz) + raise "not meta" unless clazz.class == Parfait::MetaClass raise( "no class in #{self}") unless clazz method = clazz.add_method_for(name , make_arg_type , make_frame , body ) compiler = method.compiler_for(clazz.instance_type) diff --git a/lib/vool/class_statement.rb b/lib/vool/class_statement.rb index dd43efd0..2b768840 100644 --- a/lib/vool/class_statement.rb +++ b/lib/vool/class_statement.rb @@ -20,10 +20,14 @@ module Vool def to_mom( _ ) create_class_object method_compilers = body.statements.collect do |node| - unless node.is_a?(MethodStatement) or node.is_a?(ClassMethodStatement) + case node + when MethodStatement + node.to_mom(@clazz) + when ClassMethodStatement + node.to_mom(@clazz.meta_class) + else raise "Only methods for now #{node.class}:#{node}" end - node.to_mom(@clazz) end Mom::MomCompiler.new(method_compilers) end diff --git a/test/parfait/test_space.rb b/test/parfait/test_space.rb index 375f5709..fdbe2423 100644 --- a/test/parfait/test_space.rb +++ b/test/parfait/test_space.rb @@ -18,11 +18,17 @@ module Parfait assert @space.false_object , "No lies" assert @space.nil_object , "No nothing" end + def space_class + Parfait.object_space.get_class_by_name(:Space) + end def test_global_space assert_equal Parfait::Space , Parfait.object_space.class end def test_get_class_by_name - assert_equal Parfait::Class , Parfait.object_space.get_class_by_name(:Space).class + assert_equal Parfait::Class , space_class.class + end + def test_get_meta_class + assert_equal Parfait::MetaClass , space_class.meta_class.class end def test_get_type_by_class_name assert_equal Parfait::Type , Parfait.object_space.get_type_by_class_name(:Space).class @@ -88,6 +94,11 @@ module Parfait end end end + def test_all_meta + @space.classes.each do |name , clazz| + assert clazz.meta_class , clazz.name + end + end def test_has_factory assert_equal Dictionary , @space.factories.class end