2017-04-01 14:57:39 +02:00
|
|
|
module Vool
|
2017-04-08 11:11:52 +02:00
|
|
|
class ClassStatement < Statement
|
2017-04-01 14:57:39 +02:00
|
|
|
attr_reader :name, :super_class_name , :body
|
2017-04-08 11:11:52 +02:00
|
|
|
attr_reader :clazz
|
2017-04-01 14:57:39 +02:00
|
|
|
|
|
|
|
def initialize( name , supe , body)
|
2018-06-29 22:29:10 +02:00
|
|
|
@name , @super_class_name = name , supe
|
|
|
|
case body
|
|
|
|
when MethodStatement
|
|
|
|
@body = Statements.new([body])
|
|
|
|
when Statements
|
|
|
|
@body = body
|
|
|
|
when nil
|
|
|
|
@body = Statements.new([])
|
|
|
|
else
|
|
|
|
raise "what body #{body}"
|
|
|
|
end
|
2017-04-08 11:11:52 +02:00
|
|
|
end
|
|
|
|
|
2017-04-12 10:52:23 +02:00
|
|
|
def to_mom( _ )
|
2018-06-26 19:46:58 +02:00
|
|
|
create_class_object
|
2018-07-06 19:01:17 +02:00
|
|
|
method_compilers = body.statements.collect do |node|
|
2018-06-30 09:08:18 +02:00
|
|
|
raise "Only methods for now #{node}" unless node.is_a?(MethodStatement)
|
2018-07-06 19:01:17 +02:00
|
|
|
node.to_mom(@clazz)
|
2018-06-26 19:46:58 +02:00
|
|
|
end
|
2018-07-01 20:26:45 +02:00
|
|
|
Mom::MomCompiler.new(method_compilers)
|
2017-04-12 10:52:23 +02:00
|
|
|
end
|
|
|
|
|
2018-03-15 12:52:56 +01:00
|
|
|
def each(&block)
|
|
|
|
block.call(self)
|
2018-03-16 06:33:29 +01:00
|
|
|
@body.each(&block) if @body
|
2017-04-08 11:11:52 +02:00
|
|
|
end
|
|
|
|
|
2018-03-14 13:11:09 +01:00
|
|
|
def create_class_object
|
2017-04-08 11:11:52 +02:00
|
|
|
@clazz = Parfait.object_space.get_class_by_name(@name )
|
|
|
|
if(@clazz)
|
|
|
|
#FIXME super class check with "sup"
|
2017-04-08 18:20:11 +02:00
|
|
|
#existing class, don't overwrite type (parfait only?)
|
|
|
|
else
|
2017-04-08 11:11:52 +02:00
|
|
|
@clazz = Parfait.object_space.create_class(@name , @super_class_name )
|
2017-04-08 18:20:11 +02:00
|
|
|
ivar_hash = {}
|
2018-03-15 12:52:56 +01:00
|
|
|
self.each do |node|
|
|
|
|
next unless node.is_a?(InstanceVariable) or node.is_a?(IvarAssignment)
|
|
|
|
ivar_hash[node.name] = :Object
|
|
|
|
end
|
2017-04-08 18:20:11 +02:00
|
|
|
@clazz.set_instance_type( Parfait::Type.for_hash( @clazz , ivar_hash ) )
|
2017-04-08 11:11:52 +02:00
|
|
|
end
|
2017-04-01 14:57:39 +02:00
|
|
|
end
|
2018-07-03 21:18:19 +02:00
|
|
|
|
|
|
|
def to_s(depth = 0)
|
|
|
|
at_depth(depth , "class #{name}" , @body.to_s(depth + 1) , "end")
|
|
|
|
end
|
2017-04-01 14:57:39 +02:00
|
|
|
end
|
|
|
|
end
|