rubyx/lib/soml/compiler/function_definition.rb

49 lines
1.4 KiB
Ruby
Raw Normal View History

2015-10-23 13:22:55 +02:00
module Soml
Compiler.class_eval do
def on_function statement
#puts statement.inspect
return_type , name , parameters, kids , receiver = *statement
name = name.to_a.first
raise "Already in method #{@method}" if @method
args = parameters.to_a.collect do |p|
2015-09-20 15:30:07 +02:00
raise "error, argument must be a identifier, not #{p}" unless p.type == :parameter
2015-09-27 15:06:48 +02:00
Parfait::Variable.new( *p)
2014-07-16 12:20:47 +02:00
end
class_method = nil
if(receiver )
if( receiver.first == :self) #class method
class_method = @clazz
2015-10-26 16:23:35 +01:00
@clazz = @clazz.meta
else
raise "Not covered #{receiver}"
end
end
r = @clazz
class_name = @clazz.name
@method = @clazz.get_instance_method( name )
if(@method)
2015-10-18 16:20:25 +02:00
#puts "Warning, redefining method #{name}" unless name == :main
#TODO check args / type compatibility
@method.source.init @method
else
@method = Register::MethodSource.create_method_for(@clazz, return_type, name , args )
@clazz.add_instance_method @method
end
@method.source.receiver = r
2015-10-15 09:27:06 +02:00
#puts "compile method #{@method.name}"
2015-06-01 16:31:35 +02:00
kids.to_a.each do |ex|
process(ex)
end
@clazz = class_method if class_method
@method = nil
2015-10-14 14:17:33 +02:00
# function definition is a statement, does not return any value
return nil
2014-07-14 10:29:38 +02:00
end
end
end