Class: Solargraph::Pin::Signature

Inherits:
Base
  • Object
show all
Defined in:
lib/solargraph/pin/signature.rb

Instance Attribute Summary collapse

Attributes inherited from Base

#code_object, #location, #name, #path, #source

Attributes included from Common

#closure, #context, #location

Instance Method Summary collapse

Methods inherited from Base

#==, #comments, #completion_item_kind, #deprecated?, #desc, #directives, #docstring, #erase_generics, #filename, #infer, #inspect, #macros, #maybe_directives?, #nearly?, #probe, #probed?, #proxied?, #proxy, #realize, #resolve_generics, #symbol_kind, #to_s, #try_merge!, #typify, #variable?

Methods included from Documenting

#documentation, normalize_indentation, strip_html_comments

Methods included from Conversions

#completion_item, #completion_item_kind, #deprecated?, #detail, #link_documentation, #probed?, #proxied?, #reset_conversions, #resolve_completion_item, #signature_help, #text_documentation

Methods included from Common

#binder, #comments, #name, #namespace, #path

Constructor Details

#initialize(generics, parameters, return_type, block = nil) ⇒ Signature

Returns a new instance of Signature.

Parameters:



17
18
19
20
21
22
# File 'lib/solargraph/pin/signature.rb', line 17

def initialize generics, parameters, return_type, block = nil
  @generics = generics
  @parameters = parameters
  @return_type = return_type
  @block = block
end

Instance Attribute Details

#blockself

Returns:

  • (self)


11
12
13
# File 'lib/solargraph/pin/signature.rb', line 11

def block
  @block
end

#parameters::Array<Parameter>

Returns:



5
6
7
# File 'lib/solargraph/pin/signature.rb', line 5

def parameters
  @parameters
end

#return_typeComplexType (readonly)

Returns:



8
9
10
# File 'lib/solargraph/pin/signature.rb', line 8

def return_type
  @return_type
end

Instance Method Details

#block?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/solargraph/pin/signature.rb', line 132

def block?
  !!@block
end

#genericsObject



24
25
26
# File 'lib/solargraph/pin/signature.rb', line 24

def generics
  @generics ||= [].freeze
end

#identityObject



128
129
130
# File 'lib/solargraph/pin/signature.rb', line 128

def identity
  @identity ||= "signature#{object_id}"
end

#rbs_genericsString

Returns:

  • (String)


34
35
36
37
38
39
40
# File 'lib/solargraph/pin/signature.rb', line 34

def rbs_generics
  if generics.empty?
    return ''
  else
    return '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
  end
end

#resolve_generics_from_context(generics_to_resolve, arg_types = nil, return_type_context = nil, yield_arg_types = nil, yield_return_type_context = nil, resolved_generic_values: {}) ⇒ self

Parameters:

  • generics_to_resolve (Enumerable<String>)
  • arg_types (Array<ComplexType>, nil) (defaults to: nil)
  • return_type_context (ComplexType, nil) (defaults to: nil)
  • yield_arg_types (Array<ComplexType>, nil) (defaults to: nil)
  • yield_return_type_context (ComplexType, nil) (defaults to: nil)
  • context (ComplexType, nil)
  • resolved_generic_values (Hash{String => ComplexType}) (defaults to: {})

Returns:

  • (self)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/solargraph/pin/signature.rb', line 64

def resolve_generics_from_context(generics_to_resolve,
                                  arg_types = nil,
                                  return_type_context = nil,
                                  yield_arg_types = nil,
                                  yield_return_type_context = nil,
                                  resolved_generic_values: {})
  signature = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
  signature.parameters = signature.parameters.each_with_index.map do |param, i|
    if arg_types.nil?
      param.dup
    else
      param.resolve_generics_from_context(generics_to_resolve,
                                          arg_types[i],
                                          resolved_generic_values: resolved_generic_values)
    end
  end
  signature.block = block.resolve_generics_from_context(generics_to_resolve,
                                                        yield_arg_types,
                                                        yield_return_type_context,
                                                        resolved_generic_values: resolved_generic_values) if signature.block?
  signature
end

#resolve_generics_from_context_until_complete(generics_to_resolve, arg_types = nil, return_type_context = nil, yield_arg_types = nil, yield_return_type_context = nil, resolved_generic_values: {}) ⇒ self

Parameters:

  • generics_to_resolve (Enumerable<String>)
  • arg_types (Array<ComplexType>, nil) (defaults to: nil)
  • return_type_context (ComplexType, nil) (defaults to: nil)
  • yield_arg_types (Array<ComplexType>, nil) (defaults to: nil)
  • yield_return_type_context (ComplexType, nil) (defaults to: nil)
  • context (ComplexType, nil)
  • resolved_generic_values (Hash{String => ComplexType}) (defaults to: {})

Returns:

  • (self)


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/solargraph/pin/signature.rb', line 95

def resolve_generics_from_context_until_complete(generics_to_resolve,
                                                 arg_types = nil,
                                                 return_type_context = nil,
                                                 yield_arg_types = nil,
                                                 yield_return_type_context = nil,
                                                 resolved_generic_values: {})
  # See
  # https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
  # and
  # https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
  # for other implementations

  return self if generics_to_resolve.empty?

  last_resolved_generic_values = resolved_generic_values.dup
  new_pin = resolve_generics_from_context(generics_to_resolve,
                                          arg_types,
                                          return_type_context,
                                          yield_arg_types,
                                          yield_return_type_context,
                                          resolved_generic_values: resolved_generic_values)
  if last_resolved_generic_values == resolved_generic_values
    # erase anything unresolved
    return new_pin.erase_generics(self.generics)
  end
  new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
                                                       arg_types,
                                                       return_type_context,
                                                       yield_arg_types,
                                                       yield_return_type_context,
                                                       resolved_generic_values: resolved_generic_values)
end

#to_rbsString

Returns:

  • (String)


29
30
31
# File 'lib/solargraph/pin/signature.rb', line 29

def to_rbs
  rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
end

#transform_types {|| ... } ⇒ Array<String>, self

Yield Parameters:

Yield Returns:

Returns:

  • (Array<String>)
  • (self)


46
47
48
49
50
51
52
53
54
# File 'lib/solargraph/pin/signature.rb', line 46

def transform_types(&transform)
  # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
  signature = super(&transform)
  signature.parameters = signature.parameters.map do |param|
    param.transform_types(&transform)
  end
  signature.block = block.transform_types(&transform) if signature.block?
  signature
end