Class: Solargraph::ComplexType::UniqueType

Inherits:
Object
  • Object
show all
Includes:
TypeMethods
Defined in:
lib/solargraph/complex_type/unique_type.rb

Overview

An individual type signature. A complex type can consist of multiple unique types.

Constant Summary collapse

UNDEFINED =
UniqueType.new('undefined')
BOOLEAN =
UniqueType.new('Boolean')

Instance Attribute Summary collapse

Attributes included from TypeMethods

#name, #substring, #subtypes, #tag

Instance Method Summary collapse

Methods included from TypeMethods

#==, #defined?, #duck_type?, #each_unique_type, #fixed_parameters?, #hash_parameters?, #key_types, #list_parameters?, #namespace, #nil_type?, #parameters?, #qualify, #rooted?, #scope, #undefined?, #value_types, #void?

Constructor Details

#initialize(name, substring = '') ⇒ UniqueType

Create a UniqueType with the specified name and an optional substring. The substring is the parameter section of a parametrized type, e.g., for the type ‘Array<String>`, the name is `Array` and the substring is `<String>`.

Parameters:

  • name (String)

    The name of the type

  • substring (String) (defaults to: '')

    The substring of the type



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/solargraph/complex_type/unique_type.rb', line 20

def initialize name, substring = ''
  if name.start_with?('::')
    @name = name[2..-1]
    @rooted = true
  else
    @name = name
    @rooted = false
  end
  @substring = substring
  @tag = @name + substring
  @key_types = []
  @subtypes = []
  @all_params = []
  return unless parameters?
  if @substring.start_with?('<(') && @substring.end_with?(')>')
    subs = ComplexType.parse(substring[2..-3], partial: true)
  else
    subs = ComplexType.parse(substring[1..-2], partial: true)
  end
  if hash_parameters?
    raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(UniqueType) and !subs[1].is_a?(UniqueType)
    @key_types.concat subs[0].map { |u| ComplexType.new([u]) }
    @subtypes.concat subs[1].map { |u| ComplexType.new([u]) }
  else
    @subtypes.concat subs
  end
  @all_params.concat @key_types
  @all_params.concat @subtypes
end

Instance Attribute Details

#all_paramsObject (readonly)

Returns the value of attribute all_params.



11
12
13
# File 'lib/solargraph/complex_type/unique_type.rb', line 11

def all_params
  @all_params
end

Instance Method Details

#parameterized?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/solargraph/complex_type/unique_type.rb', line 58

def parameterized?
  name == 'param' || all_params.any?(&:parameterized?)
end

#resolve_parameters(definitions, context) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/solargraph/complex_type/unique_type.rb', line 62

def resolve_parameters definitions, context
  new_name = if name == 'param'
    idx = definitions.parameters.index(subtypes.first.name)
    return ComplexType::UNDEFINED if idx.nil?
    param_type = context.return_type.all_params[idx]
    return ComplexType::UNDEFINED unless param_type
    param_type.to_s
  else
    name
  end
  new_key_types = if name != 'param'
    @key_types.map { |t| t.resolve_parameters(definitions, context) }.select(&:defined?)
  else
    []
  end
  new_subtypes = if name != 'param'
    @subtypes.map { |t| t.resolve_parameters(definitions, context) }.select(&:defined?)
  else
    []
  end
  if name != 'param' && !(new_key_types.empty? && new_subtypes.empty?)
    if hash_parameters?
      UniqueType.new(new_name, "{#{new_key_types.join(', ')} => #{new_subtypes.join(', ')}}")
    elsif parameters?
      if @substring.start_with?'<('
        UniqueType.new(new_name, "<(#{new_subtypes.join(', ')})>")
      else
        UniqueType.new(new_name, "<#{new_subtypes.join(', ')}>")
      end
    else
      UniqueType.new(new_name)
    end
  else
    UniqueType.new(new_name)
  end

  # idx = definitions.parameters.index(subtypes.first.name)
  # STDERR.puts "Index: #{idx}"
  # return ComplexType::UNDEFINED if idx.nil?
  # param_type = context.return_type.all_params[idx]
  # return ComplexType::UNDEFINED unless param_type
  # ComplexType.try_parse(param_type.to_s)
end

#self_to(dst) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/solargraph/complex_type/unique_type.rb', line 106

def self_to dst
  return self unless selfy?
  new_name = (@name == 'self' ? dst : @name)
  new_key_types = @key_types.map { |t| t.self_to dst }
  new_subtypes = @subtypes.map { |t| t.self_to dst }
  if hash_parameters?
    UniqueType.new(new_name, "{#{new_key_types.join(', ')} => #{new_subtypes.join(', ')}}")
  elsif parameters?
    if @substring.start_with?'<('
      UniqueType.new(new_name, "<(#{new_subtypes.join(', ')})>")
    else
      UniqueType.new(new_name, "<#{new_subtypes.join(', ')}>")
    end
  else
    UniqueType.new(new_name)
  end
end

#selfy?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/solargraph/complex_type/unique_type.rb', line 124

def selfy?
  @name == 'self' || @key_types.any?(&:selfy?) || @subtypes.any?(&:selfy?)
end

#to_rbsObject



54
55
56
# File 'lib/solargraph/complex_type/unique_type.rb', line 54

def to_rbs
  "#{namespace}#{parameters? ? "[#{subtypes.map { |s| s.to_rbs }.join(', ')}]" : ''}"
end

#to_sObject



50
51
52
# File 'lib/solargraph/complex_type/unique_type.rb', line 50

def to_s
  tag
end