module TypedRb::TypeSignature::TokenProcessor

Public Instance Methods

group_tokens(tokens) click to toggle source
# File lib/typed/type_signature/parser.rb, line 10
def group_tokens(tokens)
  next_group = []
  groups = [next_group]
  tokens.each do |token|
    if token == :<
      next_group = []
      groups << next_group
    else
      next_group << token
    end
  end
  groups
end
transform_function_tokens(tokens) click to toggle source
# File lib/typed/type_signature/parser.rb, line 24
def transform_function_tokens(tokens)
  group_tokens(tokens).map do |token_group|
    if token_group.is_a?(Array)
      transform_nested_function(token_group)
    elsif token_group.is_a?(String)
      token_group
    end
  end.compact
end
transform_nested_function(token_group) click to toggle source
# File lib/typed/type_signature/parser.rb, line 42
def transform_nested_function(token_group)
  if token_group.size > 1 &&
     token_group.last.is_a?(Hash) &&
     token_group.last[:kind] == :rest
    remaining_tokens = transform_nested_function(token_group[0...-1] + token_group.last[:parameters])
    {:kind => :rest,
     :type => 'Array',
     :parameters => [remaining_tokens]}
  elsif token_group.size > 1 &&
     variable_group?(token_group) &&
     token_group[0].is_a?(String)
    { :type       => token_group.first,
      :parameters => token_group.drop(1),
      :kind       => :generic_type }
  elsif token_group.size < 2
    token_group.first
  else
    token_group
  end
end
variable_group?(token_group) click to toggle source
# File lib/typed/type_signature/parser.rb, line 34
def variable_group?(token_group)
  token_group.drop(1).all? do |token|
    token.is_a?(Hash) &&
      (token[:kind] == :type_var ||
       token[:kind] == :generic_type)
  end
end