solargraph 0.58.1 → 0.59.0.dev.1

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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,104 +1,126 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Block < Callable
6
- include Breakable
7
-
8
- # @return [Parser::AST::Node]
9
- attr_reader :receiver
10
-
11
- # @return [Parser::AST::Node]
12
- attr_reader :node
13
-
14
- # @param receiver [Parser::AST::Node, nil]
15
- # @param node [Parser::AST::Node, nil]
16
- # @param context [ComplexType, nil]
17
- # @param args [::Array<Parameter>]
18
- def initialize receiver: nil, args: [], context: nil, node: nil, **splat
19
- super(**splat, parameters: args)
20
- @receiver = receiver
21
- @context = context
22
- @return_type = ComplexType.parse('::Proc')
23
- @node = node
24
- end
25
-
26
- # @param api_map [ApiMap]
27
- # @return [void]
28
- def rebind api_map
29
- @rebind ||= maybe_rebind(api_map)
30
- end
31
-
32
- def binder
33
- @rebind&.defined? ? @rebind : closure.binder
34
- end
35
-
36
- # @param yield_types [::Array<ComplexType>]
37
- # @param parameters [::Array<Parameter>]
38
- #
39
- # @return [::Array<ComplexType>]
40
- def destructure_yield_types(yield_types, parameters)
41
- # yielding a tuple into a block will destructure the tuple
42
- if yield_types.length == 1
43
- yield_type = yield_types.first
44
- return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
45
- end
46
- parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
47
- end
48
-
49
- # @param api_map [ApiMap]
50
- # @return [::Array<ComplexType>]
51
- def typify_parameters(api_map)
52
- chain = Parser.chain(receiver, filename, node)
53
- clip = api_map.clip_at(location.filename, location.range.start)
54
- locals = clip.locals - [self]
55
- meths = chain.define(api_map, closure, locals)
56
- # @todo Convert logic to use signatures
57
- # @param meth [Pin::Method]
58
- meths.each do |meth|
59
- next if meth.block.nil?
60
-
61
- yield_types = meth.block.parameters.map(&:return_type)
62
- # 'arguments' is what the method says it will yield to the
63
- # block; 'parameters' is what the block accepts
64
- argument_types = destructure_yield_types(yield_types, parameters)
65
- param_types = argument_types.each_with_index.map do |arg_type, idx|
66
- param = parameters[idx]
67
- param_type = chain.base.infer(api_map, param, locals)
68
- unless arg_type.nil?
69
- if arg_type.generic? && param_type.defined?
70
- namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
71
- arg_type.resolve_generics(namespace_pin, param_type)
72
- else
73
- arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
74
- end
75
- end
76
- end
77
- return param_types if param_types.all?(&:defined?)
78
- end
79
- parameters.map { ComplexType::UNDEFINED }
80
- end
81
-
82
- private
83
-
84
- # @param api_map [ApiMap]
85
- # @return [ComplexType]
86
- def maybe_rebind api_map
87
- return ComplexType::UNDEFINED unless receiver
88
-
89
- chain = Parser.chain(receiver, location.filename)
90
- locals = api_map.source_map(location.filename).locals_at(location)
91
- receiver_pin = chain.define(api_map, closure, locals).first
92
- return ComplexType::UNDEFINED unless receiver_pin
93
-
94
- types = receiver_pin.docstring.tag(:yieldreceiver)&.types
95
- return ComplexType::UNDEFINED unless types&.any?
96
-
97
- target = chain.base.infer(api_map, receiver_pin, locals)
98
- target = full_context unless target.defined?
99
-
100
- ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
101
- end
102
- end
103
- end
104
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Block < Callable
6
+ include Breakable
7
+
8
+ # @return [Parser::AST::Node]
9
+ attr_reader :receiver
10
+
11
+ # @return [Parser::AST::Node]
12
+ attr_reader :node
13
+
14
+ # @param receiver [Parser::AST::Node, nil]
15
+ # @param node [Parser::AST::Node, nil]
16
+ # @param context [ComplexType, nil]
17
+ # @param args [::Array<Parameter>]
18
+ def initialize receiver: nil, args: [], context: nil, node: nil, **splat
19
+ super(**splat, parameters: args)
20
+ @receiver = receiver
21
+ @context = context
22
+ @return_type = ComplexType.parse('::Proc')
23
+ @node = node
24
+ @name = '<block>'
25
+ end
26
+
27
+ # @param api_map [ApiMap]
28
+ # @return [void]
29
+ def rebind api_map
30
+ @rebind ||= maybe_rebind(api_map)
31
+ end
32
+
33
+ def binder
34
+ out = @rebind if @rebind&.defined?
35
+ out ||= super
36
+ end
37
+
38
+ def context
39
+ @context = @rebind if @rebind&.defined?
40
+ super
41
+ end
42
+
43
+ # @param yield_types [::Array<ComplexType>]
44
+ # @param parameters [::Array<Parameter>]
45
+ #
46
+ # @return [::Array<ComplexType>]
47
+ def destructure_yield_types(yield_types, parameters)
48
+ # yielding a tuple into a block will destructure the tuple
49
+ if yield_types.length == 1
50
+ yield_type = yield_types.first
51
+ return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
52
+ end
53
+ parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
54
+ end
55
+
56
+ # @param api_map [ApiMap]
57
+ # @return [::Array<ComplexType>]
58
+ def typify_parameters(api_map)
59
+ chain = Parser.chain(receiver, filename, node)
60
+ # @sg-ignore Need to add nil check here
61
+ clip = api_map.clip_at(location.filename, location.range.start)
62
+ locals = clip.locals - [self]
63
+ # @sg-ignore Need to add nil check here
64
+ meths = chain.define(api_map, closure, locals)
65
+ # @todo Convert logic to use signatures
66
+ # @param meth [Pin::Method]
67
+ meths.each do |meth|
68
+ next if meth.block.nil?
69
+
70
+ # @sg-ignore flow sensitive typing needs to handle attrs
71
+ yield_types = meth.block.parameters.map(&:return_type)
72
+ # 'arguments' is what the method says it will yield to the
73
+ # block; 'parameters' is what the block accepts
74
+ argument_types = destructure_yield_types(yield_types, parameters)
75
+ param_types = argument_types.each_with_index.map do |arg_type, idx|
76
+ param = parameters[idx]
77
+ param_type = chain.base.infer(api_map, param, locals)
78
+ unless arg_type.nil?
79
+ if arg_type.generic? && param_type.defined?
80
+ # @sg-ignore Need to add nil check here
81
+ namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
82
+ arg_type.resolve_generics(namespace_pin, param_type)
83
+ else
84
+ arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
85
+ end
86
+ end
87
+ end
88
+ return param_types if param_types.all?(&:defined?)
89
+ end
90
+ parameters.map { ComplexType::UNDEFINED }
91
+ end
92
+
93
+ private
94
+
95
+ # @param api_map [ApiMap]
96
+ # @return [ComplexType]
97
+ def maybe_rebind api_map
98
+ return ComplexType::UNDEFINED unless receiver
99
+
100
+ # @sg-ignore Need to add nil check here
101
+ chain = Parser.chain(receiver, location.filename, node)
102
+ # @sg-ignore Need to add nil check here
103
+ locals = api_map.source_map(location.filename).locals_at(location)
104
+ # @sg-ignore Need to add nil check here
105
+ receiver_pin = chain.define(api_map, closure, locals).first
106
+ return ComplexType::UNDEFINED unless receiver_pin
107
+
108
+ types = receiver_pin.docstring.tag(:yieldreceiver)&.types
109
+ return ComplexType::UNDEFINED unless types&.any?
110
+
111
+ name_pin = self
112
+ # if we have Foo.bar { |x| ... }, and the bar method references self...
113
+ target = if chain.base.defined?
114
+ # figure out Foo
115
+ chain.base.infer(api_map, name_pin, locals)
116
+ else
117
+ # if not, any self there must be the context of our closure
118
+ # @sg-ignore Need to add nil check here
119
+ closure.full_context
120
+ end
121
+
122
+ ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -1,9 +1,13 @@
1
- module Solargraph
2
- module Pin
3
- # Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
4
- module Breakable
5
- # @return [Parser::AST::Node]
6
- attr_reader :node
7
- end
8
- end
9
- end
1
+ module Solargraph
2
+ module Pin
3
+ # Mix-in for pins which enclose code which the 'break' statement
4
+ # works with-in - e.g., blocks, when, until, ...
5
+ module Breakable
6
+ # @return [Parser::AST::Node]
7
+ attr_reader :node
8
+
9
+ # @return [Location, nil]
10
+ attr_reader :location
11
+ end
12
+ end
13
+ end