solargraph 0.50.0 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +40 -0
  3. data/.github/workflows/rspec.yml +4 -8
  4. data/.github/workflows/typecheck.yml +34 -0
  5. data/.yardopts +2 -2
  6. data/CHANGELOG.md +81 -3
  7. data/README.md +13 -16
  8. data/SPONSORS.md +2 -9
  9. data/lib/solargraph/api_map/cache.rb +60 -20
  10. data/lib/solargraph/api_map/store.rb +47 -11
  11. data/lib/solargraph/api_map.rb +161 -95
  12. data/lib/solargraph/bench.rb +2 -2
  13. data/lib/solargraph/cache.rb +30 -6
  14. data/lib/solargraph/complex_type/type_methods.rb +54 -9
  15. data/lib/solargraph/complex_type/unique_type.rb +154 -57
  16. data/lib/solargraph/complex_type.rb +91 -17
  17. data/lib/solargraph/convention.rb +0 -3
  18. data/lib/solargraph/converters/dd.rb +5 -0
  19. data/lib/solargraph/converters/dl.rb +3 -0
  20. data/lib/solargraph/converters/dt.rb +3 -0
  21. data/lib/solargraph/diagnostics/rubocop.rb +8 -7
  22. data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
  23. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  24. data/lib/solargraph/diagnostics.rb +2 -2
  25. data/lib/solargraph/doc_map.rb +146 -0
  26. data/lib/solargraph/gem_pins.rb +64 -0
  27. data/lib/solargraph/language_server/host/cataloger.rb +1 -0
  28. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  29. data/lib/solargraph/language_server/host/dispatch.rb +10 -4
  30. data/lib/solargraph/language_server/host/message_worker.rb +4 -0
  31. data/lib/solargraph/language_server/host/sources.rb +7 -4
  32. data/lib/solargraph/language_server/host.rb +26 -7
  33. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  34. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  35. data/lib/solargraph/language_server/message/initialize.rb +11 -0
  36. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  37. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
  38. data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -4
  39. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  40. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  41. data/lib/solargraph/language_server/message/text_document.rb +1 -1
  42. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  43. data/lib/solargraph/language_server/message.rb +1 -0
  44. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  45. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  46. data/lib/solargraph/library.rb +86 -16
  47. data/lib/solargraph/location.rb +1 -0
  48. data/lib/solargraph/parser/comment_ripper.rb +4 -0
  49. data/lib/solargraph/parser/node_methods.rb +47 -7
  50. data/lib/solargraph/parser/node_processor/base.rb +9 -0
  51. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -5
  52. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  53. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +57 -41
  54. data/lib/solargraph/parser/parser_gem/node_methods.rb +499 -0
  55. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  56. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +53 -0
  57. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  58. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  59. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
  60. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  61. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +1 -1
  62. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  63. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  65. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
  66. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  67. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  68. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  69. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
  70. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +2 -2
  71. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
  72. data/lib/solargraph/parser/parser_gem/node_processors.rb +54 -0
  73. data/lib/solargraph/parser/parser_gem.rb +12 -0
  74. data/lib/solargraph/parser/region.rb +1 -1
  75. data/lib/solargraph/parser/snippet.rb +2 -0
  76. data/lib/solargraph/parser.rb +9 -10
  77. data/lib/solargraph/pin/base.rb +64 -9
  78. data/lib/solargraph/pin/base_variable.rb +6 -2
  79. data/lib/solargraph/pin/block.rb +19 -9
  80. data/lib/solargraph/pin/closure.rb +17 -2
  81. data/lib/solargraph/pin/common.rb +7 -3
  82. data/lib/solargraph/pin/conversions.rb +33 -3
  83. data/lib/solargraph/pin/delegated_method.rb +97 -0
  84. data/lib/solargraph/pin/documenting.rb +25 -34
  85. data/lib/solargraph/pin/instance_variable.rb +4 -0
  86. data/lib/solargraph/pin/local_variable.rb +13 -1
  87. data/lib/solargraph/pin/method.rb +182 -18
  88. data/lib/solargraph/pin/namespace.rb +18 -5
  89. data/lib/solargraph/pin/parameter.rb +44 -14
  90. data/lib/solargraph/pin/reference/override.rb +2 -2
  91. data/lib/solargraph/pin/reference.rb +8 -0
  92. data/lib/solargraph/pin/search.rb +4 -4
  93. data/lib/solargraph/pin/signature.rb +123 -3
  94. data/lib/solargraph/pin.rb +1 -1
  95. data/lib/solargraph/range.rb +4 -6
  96. data/lib/solargraph/rbs_map/conversions.rb +294 -50
  97. data/lib/solargraph/rbs_map/core_fills.rb +7 -24
  98. data/lib/solargraph/rbs_map/core_map.rb +3 -2
  99. data/lib/solargraph/rbs_map/core_signs.rb +2 -0
  100. data/lib/solargraph/rbs_map/stdlib_map.rb +2 -5
  101. data/lib/solargraph/rbs_map.rb +20 -11
  102. data/lib/solargraph/shell.rb +62 -59
  103. data/lib/solargraph/source/chain/array.rb +32 -0
  104. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  105. data/lib/solargraph/source/chain/call.rb +99 -46
  106. data/lib/solargraph/source/chain/constant.rb +15 -1
  107. data/lib/solargraph/source/chain/if.rb +23 -0
  108. data/lib/solargraph/source/chain/link.rb +8 -2
  109. data/lib/solargraph/source/chain/or.rb +1 -1
  110. data/lib/solargraph/source/chain/z_super.rb +3 -3
  111. data/lib/solargraph/source/chain.rb +29 -14
  112. data/lib/solargraph/source/change.rb +3 -0
  113. data/lib/solargraph/source/cursor.rb +2 -0
  114. data/lib/solargraph/source/source_chainer.rb +8 -5
  115. data/lib/solargraph/source.rb +18 -19
  116. data/lib/solargraph/source_map/clip.rb +25 -23
  117. data/lib/solargraph/source_map/mapper.rb +12 -1
  118. data/lib/solargraph/source_map.rb +30 -7
  119. data/lib/solargraph/type_checker/checks.rb +10 -2
  120. data/lib/solargraph/type_checker.rb +123 -45
  121. data/lib/solargraph/version.rb +1 -1
  122. data/lib/solargraph/workspace/config.rb +14 -11
  123. data/lib/solargraph/workspace.rb +3 -2
  124. data/lib/solargraph/yard_map/cache.rb +6 -0
  125. data/lib/solargraph/yard_map/helpers.rb +1 -1
  126. data/lib/solargraph/yard_map/mapper/to_method.rb +11 -1
  127. data/lib/solargraph/yard_map/mapper.rb +1 -1
  128. data/lib/solargraph/yard_map/to_method.rb +11 -4
  129. data/lib/solargraph/yard_map.rb +1 -284
  130. data/lib/solargraph/yard_tags.rb +20 -0
  131. data/lib/solargraph/yardoc.rb +52 -0
  132. data/lib/solargraph.rb +6 -4
  133. data/solargraph.gemspec +11 -5
  134. metadata +131 -75
  135. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  136. data/lib/solargraph/convention/rspec.rb +0 -30
  137. data/lib/solargraph/documentor.rb +0 -76
  138. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  139. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  140. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  141. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  142. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +0 -23
  143. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +0 -23
  144. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  145. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  146. data/lib/solargraph/parser/legacy.rb +0 -12
  147. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -149
  148. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  149. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  150. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  151. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  152. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  153. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  154. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  155. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  156. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  157. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  158. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  159. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  160. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  161. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  162. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  163. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  164. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  165. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  166. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  167. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  168. data/lib/solargraph/parser/rubyvm.rb +0 -40
  169. data/lib/yard-solargraph.rb +0 -33
@@ -9,6 +9,14 @@ module Solargraph
9
9
  autoload :Prepend, 'solargraph/pin/reference/prepend'
10
10
  autoload :Extend, 'solargraph/pin/reference/extend'
11
11
  autoload :Override, 'solargraph/pin/reference/override'
12
+
13
+ attr_reader :generic_values
14
+
15
+ # @param generic_values [Array<String>]
16
+ def initialize generic_values: [], **splat
17
+ super(**splat)
18
+ @generic_values = generic_values
19
+ end
12
20
  end
13
21
  end
14
22
  end
@@ -18,21 +18,21 @@ module Solargraph
18
18
  end
19
19
  end
20
20
 
21
- # @param pins [Array<Pin::Base>]
21
+ # @param pins [::Array<Pin::Base>]
22
22
  # @param query [String]
23
23
  def initialize pins, query
24
24
  @pins = pins
25
25
  @query = query
26
26
  end
27
27
 
28
- # @return [Array<Pin::Base>]
28
+ # @return [::Array<Pin::Base>]
29
29
  def results
30
30
  @results ||= do_query
31
31
  end
32
32
 
33
33
  private
34
34
 
35
- # @return [Array<Pin::Base>]
35
+ # @return [::Array<Pin::Base>]
36
36
  def do_query
37
37
  return @pins if @query.nil? || @query.empty?
38
38
  @pins.map do |pin|
@@ -49,7 +49,7 @@ module Solargraph
49
49
  # @return [Float]
50
50
  def fuzzy_string_match str1, str2
51
51
  return (1.0 + (str2.length.to_f / str1.length.to_f)) if str1.downcase.include?(str2.downcase)
52
- JaroWinkler.distance(str1, str2, ignore_case: true)
52
+ JaroWinkler.similarity(str1, str2, ignore_case: true)
53
53
  end
54
54
  end
55
55
  end
@@ -1,23 +1,143 @@
1
1
  module Solargraph
2
2
  module Pin
3
- class Signature
4
- # @return [Array<Parameter>]
3
+ class Signature < Base
4
+ # @return [::Array<Parameter>]
5
5
  attr_reader :parameters
6
6
 
7
7
  # @return [ComplexType]
8
8
  attr_reader :return_type
9
9
 
10
+ # @return [self]
10
11
  attr_reader :block
11
12
 
12
- def initialize parameters, return_type, block = nil
13
+ # @param generics [Array<String>]
14
+ # @param parameters [Array<Parameter>]
15
+ # @param return_type [ComplexType]
16
+ # @param block [Signature, nil]
17
+ def initialize generics, parameters, return_type, block = nil
18
+ @generics = generics
13
19
  @parameters = parameters
14
20
  @return_type = return_type
15
21
  @block = block
16
22
  end
17
23
 
24
+ def generics
25
+ @generics ||= [].freeze
26
+ end
27
+
28
+ # @return [String]
29
+ def to_rbs
30
+ rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
31
+ end
32
+
33
+ # @return [String]
34
+ def rbs_generics
35
+ if generics.empty?
36
+ return ''
37
+ else
38
+ return '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
39
+ end
40
+ end
41
+
42
+ # @return [Array<String>]
43
+ # @yieldparam [ComplexType]
44
+ # @yieldreturn [ComplexType]
45
+ # @return [self]
46
+ def transform_types(&transform)
47
+ # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
48
+ signature = super(&transform)
49
+ signature.parameters = signature.parameters.map do |param|
50
+ param.transform_types(&transform)
51
+ end
52
+ signature.block = block.transform_types(&transform) if signature.block?
53
+ signature
54
+ end
55
+
56
+ # @param generics_to_resolve [Enumerable<String>]
57
+ # @param arg_types [Array<ComplexType>, nil]
58
+ # @param return_type_context [ComplexType, nil]
59
+ # @param yield_arg_types [Array<ComplexType>, nil]
60
+ # @param yield_return_type_context [ComplexType, nil]
61
+ # @param context [ComplexType, nil]
62
+ # @param resolved_generic_values [Hash{String => ComplexType}]
63
+ # @return [self]
64
+ def resolve_generics_from_context(generics_to_resolve,
65
+ arg_types = nil,
66
+ return_type_context = nil,
67
+ yield_arg_types = nil,
68
+ yield_return_type_context = nil,
69
+ resolved_generic_values: {})
70
+ signature = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
71
+ signature.parameters = signature.parameters.each_with_index.map do |param, i|
72
+ if arg_types.nil?
73
+ param.dup
74
+ else
75
+ param.resolve_generics_from_context(generics_to_resolve,
76
+ arg_types[i],
77
+ resolved_generic_values: resolved_generic_values)
78
+ end
79
+ end
80
+ signature.block = block.resolve_generics_from_context(generics_to_resolve,
81
+ yield_arg_types,
82
+ yield_return_type_context,
83
+ resolved_generic_values: resolved_generic_values) if signature.block?
84
+ signature
85
+ end
86
+
87
+ # @param generics_to_resolve [Enumerable<String>]
88
+ # @param arg_types [Array<ComplexType>, nil]
89
+ # @param return_type_context [ComplexType, nil]
90
+ # @param yield_arg_types [Array<ComplexType>, nil]
91
+ # @param yield_return_type_context [ComplexType, nil]
92
+ # @param context [ComplexType, nil]
93
+ # @param resolved_generic_values [Hash{String => ComplexType}]
94
+ # @return [self]
95
+ def resolve_generics_from_context_until_complete(generics_to_resolve,
96
+ arg_types = nil,
97
+ return_type_context = nil,
98
+ yield_arg_types = nil,
99
+ yield_return_type_context = nil,
100
+ resolved_generic_values: {})
101
+ # See
102
+ # https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
103
+ # and
104
+ # https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
105
+ # for other implementations
106
+
107
+ return self if generics_to_resolve.empty?
108
+
109
+ last_resolved_generic_values = resolved_generic_values.dup
110
+ new_pin = resolve_generics_from_context(generics_to_resolve,
111
+ arg_types,
112
+ return_type_context,
113
+ yield_arg_types,
114
+ yield_return_type_context,
115
+ resolved_generic_values: resolved_generic_values)
116
+ if last_resolved_generic_values == resolved_generic_values
117
+ # erase anything unresolved
118
+ return new_pin.erase_generics(self.generics)
119
+ end
120
+ new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
121
+ arg_types,
122
+ return_type_context,
123
+ yield_arg_types,
124
+ yield_return_type_context,
125
+ resolved_generic_values: resolved_generic_values)
126
+ end
127
+
128
+ def identity
129
+ @identity ||= "signature#{object_id}"
130
+ end
131
+
18
132
  def block?
19
133
  !!@block
20
134
  end
135
+
136
+ protected
137
+
138
+ attr_writer :block
139
+
140
+ attr_writer :parameters
21
141
  end
22
142
  end
23
143
  end
@@ -12,6 +12,7 @@ module Solargraph
12
12
  autoload :Method, 'solargraph/pin/method'
13
13
  autoload :Signature, 'solargraph/pin/signature'
14
14
  autoload :MethodAlias, 'solargraph/pin/method_alias'
15
+ autoload :DelegatedMethod, 'solargraph/pin/delegated_method'
15
16
  autoload :BaseVariable, 'solargraph/pin/base_variable'
16
17
  autoload :InstanceVariable, 'solargraph/pin/instance_variable'
17
18
  autoload :ClassVariable, 'solargraph/pin/class_variable'
@@ -26,7 +27,6 @@ module Solargraph
26
27
  autoload :Reference, 'solargraph/pin/reference'
27
28
  autoload :Documenting, 'solargraph/pin/documenting'
28
29
  autoload :Block, 'solargraph/pin/block'
29
- autoload :Localized, 'solargraph/pin/localized'
30
30
  autoload :ProxyType, 'solargraph/pin/proxy_type'
31
31
  autoload :DuckMethod, 'solargraph/pin/duck_method'
32
32
  autoload :Singleton, 'solargraph/pin/singleton'
@@ -62,13 +62,11 @@ module Solargraph
62
62
 
63
63
  # Get a range from a node.
64
64
  #
65
- # @param node [RubyVM::AbstractSyntaxTree::Node, Parser::AST::Node]
66
- # @return [Range]
65
+ # @param node [Parser::AST::Node]
66
+ # @return [Range, nil]
67
67
  def self.from_node node
68
- if defined?(RubyVM::AbstractSyntaxTree::Node)
69
- if node.is_a?(RubyVM::AbstractSyntaxTree::Node)
70
- Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
71
- end
68
+ if Parser.rubyvm? && node.is_a?(RubyVM::AbstractSyntaxTree::Node)
69
+ Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
72
70
  elsif node&.loc && node.loc.expression
73
71
  from_expr(node.loc.expression)
74
72
  end