class MethodSignature
Public Class Methods
new(line, class_name, method_id, is_block, parameters, other_signatures)
click to toggle source
# File lib/signature.rb, line 2 def initialize(line, class_name, method_id, is_block, parameters, other_signatures) @line = line @class_name = class_name @method_id = method_id @is_block = is_block @parameters = parameters # For each parameter signature (key), store a set of return types (value) @return_values = Hash.new { | h, k | h[k] = Set.new } @parameter_values = Hash.new @other_signatures = other_signatures end
Public Instance Methods
add(parameter_values, return_value, owner)
click to toggle source
# File lib/signature.rb, line 103 def add(parameter_values, return_value, owner) if return_value.class.to_s == owner.class.name or @method_id == :initialize return_value = "self" end parameter_sig = generate_parameter_signature(parameter_values) @return_values[parameter_sig].add(return_value) @parameter_values[parameter_sig] = parameter_values end
expand_block(block)
click to toggle source
# File lib/signature.rb, line 22 def expand_block(block) if block.class.to_s != "Proc" return end block_params = block.parameters block_id = "#{block.source_location[0]} #{block.source_location[1]}" if @other_signatures.key?(block_id) @other_signatures[block_id].update_parameters(block_params) block_signatures = @other_signatures[block_id].get_signatures if block_signatures.size == 1 "{#{block_signatures[0]}}" elsif block_signatures.size > 1 "{\n#{@other_signatures[block_id].get_signatures.join("\n")}\n}" end end end
generate_parameter_signature(parameter_values)
click to toggle source
# File lib/signature.rb, line 39 def generate_parameter_signature(parameter_values) signatures = @parameters.map do |parameter| prefix = "" if parameter[0] == :opt prefix = "?" end name = parameter[1] value = parameter_values[name] type = value.class if type.to_s == "Proc" expanded = expand_block(value) if expanded type = expanded end end "#{prefix}#{type} #{name}" end method_block_signature = "" if @parameters.size > 0 and @parameters[-1][0] == :block expanded = expand_block(parameter_values[@parameters[-1][1]]) if expanded signatures.pop method_block_signature = " #{expanded}" end end "(#{signatures.join(", ")})#{method_block_signature}" end
generate_return_signature(return_values)
click to toggle source
# File lib/signature.rb, line 67 def generate_return_signature(return_values) types = return_values.to_a.map do |return_value| if return_value == "self" return_value else expanded = expand_block(return_value) if !expanded return_value.class else expanded end end end types.join(" or ") end
get_signatures()
click to toggle source
# File lib/signature.rb, line 87 def get_signatures @return_values.to_a.map do |a| parameter_values = @parameter_values[a[0]] parameter_signature = generate_parameter_signature(parameter_values) return_signature = generate_return_signature(a[1]) "#{parameter_signature} -> #{return_signature}" end end
signature_prefix()
click to toggle source
# File lib/signature.rb, line 14 def signature_prefix if !@is_block "#{@class_name}, :#{@method_id}, " else "" end end
to_s()
click to toggle source
# File lib/signature.rb, line 96 def to_s signatures = get_signatures.map do |signature| "#{@line} type #{signature_prefix}'#{signature}'" end signatures.join("\n") end
update_parameters(parameters)
click to toggle source
# File lib/signature.rb, line 83 def update_parameters(parameters) @parameters = parameters end