Module: TypedRb::TypeSignature::TokenProcessor

Included in:
Parser
Defined in:
lib/typed/type_signature/parser.rb

Instance Method Summary collapse

Instance Method Details

#group_tokens(tokens) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# 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) ⇒ Object



24
25
26
27
28
29
30
31
32
# 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) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
40
# 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