solargraph 0.58.0 → 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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +4 -5
  5. data/.github/workflows/plugins.yml +40 -36
  6. data/.github/workflows/rspec.yml +45 -13
  7. data/.github/workflows/typecheck.yml +2 -2
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +3 -0
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/bin/solargraph +8 -8
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +289 -279
  15. data/lib/solargraph/api_map/index.rb +204 -193
  16. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  17. data/lib/solargraph/api_map/store.rb +387 -384
  18. data/lib/solargraph/api_map.rb +1000 -945
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  21. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  22. data/lib/solargraph/complex_type.rb +549 -444
  23. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  24. data/lib/solargraph/convention/data_definition.rb +108 -105
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  27. data/lib/solargraph/convention/struct_definition.rb +168 -164
  28. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  29. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  30. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  31. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  32. data/lib/solargraph/doc_map.rb +200 -439
  33. data/lib/solargraph/equality.rb +34 -34
  34. data/lib/solargraph/gem_pins.rb +97 -98
  35. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  36. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  37. data/lib/solargraph/language_server/host/sources.rb +100 -99
  38. data/lib/solargraph/language_server/host.rb +883 -878
  39. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  40. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  41. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  42. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  43. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  44. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  45. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  46. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  47. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  48. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  49. data/lib/solargraph/library.rb +729 -683
  50. data/lib/solargraph/location.rb +87 -82
  51. data/lib/solargraph/logging.rb +57 -37
  52. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  53. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  54. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  55. data/lib/solargraph/parser/node_processor.rb +63 -62
  56. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  57. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  58. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  59. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  60. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  61. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  62. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  63. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  64. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  65. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  66. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  67. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  68. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  69. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  70. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  71. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  72. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  73. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  74. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  75. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  76. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  77. data/lib/solargraph/parser/region.rb +75 -69
  78. data/lib/solargraph/parser/snippet.rb +17 -17
  79. data/lib/solargraph/pin/base.rb +761 -729
  80. data/lib/solargraph/pin/base_variable.rb +418 -126
  81. data/lib/solargraph/pin/block.rb +126 -104
  82. data/lib/solargraph/pin/breakable.rb +13 -9
  83. data/lib/solargraph/pin/callable.rb +278 -231
  84. data/lib/solargraph/pin/closure.rb +68 -72
  85. data/lib/solargraph/pin/common.rb +94 -79
  86. data/lib/solargraph/pin/compound_statement.rb +55 -0
  87. data/lib/solargraph/pin/conversions.rb +124 -123
  88. data/lib/solargraph/pin/delegated_method.rb +131 -120
  89. data/lib/solargraph/pin/documenting.rb +115 -114
  90. data/lib/solargraph/pin/instance_variable.rb +38 -34
  91. data/lib/solargraph/pin/keyword.rb +16 -20
  92. data/lib/solargraph/pin/local_variable.rb +31 -75
  93. data/lib/solargraph/pin/method.rb +720 -672
  94. data/lib/solargraph/pin/method_alias.rb +42 -34
  95. data/lib/solargraph/pin/namespace.rb +121 -115
  96. data/lib/solargraph/pin/parameter.rb +338 -275
  97. data/lib/solargraph/pin/proxy_type.rb +40 -39
  98. data/lib/solargraph/pin/reference/override.rb +47 -47
  99. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  100. data/lib/solargraph/pin/reference.rb +41 -39
  101. data/lib/solargraph/pin/search.rb +62 -61
  102. data/lib/solargraph/pin/signature.rb +69 -61
  103. data/lib/solargraph/pin/symbol.rb +53 -53
  104. data/lib/solargraph/pin/until.rb +18 -18
  105. data/lib/solargraph/pin/while.rb +18 -18
  106. data/lib/solargraph/pin.rb +46 -44
  107. data/lib/solargraph/pin_cache.rb +665 -245
  108. data/lib/solargraph/position.rb +118 -119
  109. data/lib/solargraph/range.rb +112 -112
  110. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  111. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  112. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  113. data/lib/solargraph/rbs_map.rb +217 -163
  114. data/lib/solargraph/shell.rb +397 -352
  115. data/lib/solargraph/source/chain/call.rb +372 -337
  116. data/lib/solargraph/source/chain/constant.rb +28 -26
  117. data/lib/solargraph/source/chain/hash.rb +35 -34
  118. data/lib/solargraph/source/chain/if.rb +29 -28
  119. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  120. data/lib/solargraph/source/chain/literal.rb +53 -48
  121. data/lib/solargraph/source/chain/or.rb +31 -23
  122. data/lib/solargraph/source/chain.rb +294 -291
  123. data/lib/solargraph/source/change.rb +89 -82
  124. data/lib/solargraph/source/cursor.rb +172 -166
  125. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  126. data/lib/solargraph/source/source_chainer.rb +204 -194
  127. data/lib/solargraph/source/updater.rb +59 -55
  128. data/lib/solargraph/source.rb +524 -498
  129. data/lib/solargraph/source_map/clip.rb +237 -226
  130. data/lib/solargraph/source_map/data.rb +37 -34
  131. data/lib/solargraph/source_map/mapper.rb +282 -259
  132. data/lib/solargraph/source_map.rb +220 -212
  133. data/lib/solargraph/type_checker/problem.rb +34 -32
  134. data/lib/solargraph/type_checker/rules.rb +157 -84
  135. data/lib/solargraph/type_checker.rb +895 -814
  136. data/lib/solargraph/version.rb +5 -5
  137. data/lib/solargraph/workspace/config.rb +257 -255
  138. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  139. data/lib/solargraph/workspace/require_paths.rb +98 -97
  140. data/lib/solargraph/workspace.rb +362 -220
  141. data/lib/solargraph/yard_map/helpers.rb +45 -44
  142. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  143. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  144. data/lib/solargraph/yard_map/mapper.rb +84 -79
  145. data/lib/solargraph/yardoc.rb +97 -87
  146. data/lib/solargraph.rb +126 -105
  147. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  148. data/rbs/fills/tuple/tuple.rbs +28 -0
  149. data/rbs/shims/ast/0/node.rbs +5 -0
  150. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  151. data/rbs_collection.yaml +1 -1
  152. data/solargraph.gemspec +2 -1
  153. metadata +23 -17
  154. data/lib/solargraph/type_checker/checks.rb +0 -124
  155. data/lib/solargraph/type_checker/param_def.rb +0 -37
  156. data/lib/solargraph/yard_map/to_method.rb +0 -89
  157. data/sig/shims/ast/0/node.rbs +0 -5
  158. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  159. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  160. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  161. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  163. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  164. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  165. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  166. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,26 +1,28 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Constant < Link
7
- def initialize word
8
- @word = word
9
- end
10
-
11
- def resolve api_map, name_pin, locals
12
- return [Pin::ROOT_PIN] if word.empty?
13
- if word.start_with?('::')
14
- base = word[2..-1]
15
- gates = ['']
16
- else
17
- base = word
18
- gates = name_pin.gates
19
- end
20
- fqns = api_map.resolve(base, gates)
21
- api_map.get_path_pins(fqns)
22
- end
23
- end
24
- end
25
- end
26
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Constant < Link
7
+ def initialize word
8
+ @word = word
9
+ end
10
+
11
+ def resolve api_map, name_pin, locals
12
+ return [Pin::ROOT_PIN] if word.empty?
13
+ if word.start_with?('::')
14
+ base = word[2..-1]
15
+ gates = ['']
16
+ else
17
+ base = word
18
+ gates = name_pin.gates
19
+ end
20
+ # @sg-ignore Need to add nil check here
21
+ fqns = api_map.resolve(base, gates)
22
+ # @sg-ignore Need to add nil check here
23
+ api_map.get_path_pins(fqns)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,34 +1,35 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Hash < Literal
7
- # @param type [String]
8
- # @param node [Parser::AST::Node]
9
- # @param splatted [Boolean]
10
- def initialize type, node, splatted = false
11
- super(type, node)
12
- @splatted = splatted
13
- end
14
-
15
- # @sg-ignore Fix "Not enough arguments to Module#protected"
16
- protected def equality_fields
17
- super + [@splatted]
18
- end
19
-
20
- def word
21
- @word ||= "<#{@type}>"
22
- end
23
-
24
- def resolve api_map, name_pin, locals
25
- [Pin::ProxyType.anonymous(@complex_type, source: :chain)]
26
- end
27
-
28
- def splatted?
29
- @splatted
30
- end
31
- end
32
- end
33
- end
34
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Hash < Literal
7
+ # @param type [String]
8
+ # @param node [Parser::AST::Node]
9
+ # @param splatted [Boolean]
10
+ def initialize type, node, splatted = false
11
+ super(type, node)
12
+ @splatted = splatted
13
+ end
14
+
15
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
16
+ protected def equality_fields
17
+ # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
18
+ super + [@splatted]
19
+ end
20
+
21
+ def word
22
+ @word ||= "<#{@type}>"
23
+ end
24
+
25
+ def resolve api_map, name_pin, locals
26
+ [Pin::ProxyType.anonymous(@complex_type, source: :chain)]
27
+ end
28
+
29
+ def splatted?
30
+ @splatted
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,28 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class If < Link
7
- def word
8
- '<if>'
9
- end
10
-
11
- # @param links [::Array<Chain>]
12
- def initialize links
13
- @links = links
14
- end
15
-
16
- # @sg-ignore Fix "Not enough arguments to Module#protected"
17
- protected def equality_fields
18
- super + [@links]
19
- end
20
-
21
- def resolve api_map, name_pin, locals
22
- types = @links.map { |link| link.infer(api_map, name_pin, locals) }
23
- [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')), source: :chain)]
24
- end
25
- end
26
- end
27
- end
28
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class If < Link
7
+ def word
8
+ '<if>'
9
+ end
10
+
11
+ # @param links [::Array<Chain>]
12
+ def initialize links
13
+ @links = links
14
+ end
15
+
16
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
17
+ protected def equality_fields
18
+ # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
19
+ super + [@links]
20
+ end
21
+
22
+ def resolve api_map, name_pin, locals
23
+ types = @links.map { |link| link.infer(api_map, name_pin, locals) }
24
+ [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')), source: :chain)]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,13 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class InstanceVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_instance_variable_pins(name_pin.binder.namespace, name_pin.binder.scope).select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class InstanceVariable < Link
7
+ # @param word [String]
8
+ # @param node [Parser::AST::Node, nil] The node representing the variable
9
+ # @param location [Location, nil] The location of the variable reference in the source
10
+ def initialize word, node, location
11
+ super(word)
12
+ @node = node
13
+ @location = location
14
+ end
15
+
16
+ # @sg-ignore Declared return type
17
+ # ::Array<::Solargraph::Pin::Base> does not match inferred
18
+ # type ::Array<::Solargraph::Pin::BaseVariable, ::NilClass>
19
+ # for Solargraph::Source::Chain::InstanceVariable#resolve
20
+ def resolve api_map, name_pin, locals
21
+ ivars = api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select{|p| p.name == word}
22
+ out = api_map.var_at_location(ivars, word, name_pin, location)
23
+ [out].compact
24
+ end
25
+
26
+ private
27
+
28
+ # @todo: Missed nil violation
29
+ # @return [Location]
30
+ attr_reader :location
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,48 +1,53 @@
1
- # frozen_string_literal: true
2
-
3
- require 'parser'
4
-
5
- module Solargraph
6
- class Source
7
- class Chain
8
- class Literal < Link
9
- def word
10
- @word ||= "<#{@type}>"
11
- end
12
-
13
- attr_reader :value
14
-
15
- # @param type [String]
16
- # @param node [Parser::AST::Node, Object]
17
- def initialize type, node
18
- if node.is_a?(::Parser::AST::Node)
19
- if node.type == :true
20
- @value = true
21
- elsif node.type == :false
22
- @value = false
23
- elsif [:int, :sym].include?(node.type)
24
- @value = node.children.first
25
- end
26
- end
27
- @type = type
28
- @literal_type = ComplexType.try_parse(@value.inspect)
29
- @complex_type = ComplexType.try_parse(type)
30
- end
31
-
32
- # @sg-ignore Fix "Not enough arguments to Module#protected"
33
- protected def equality_fields
34
- super + [@value, @type, @literal_type, @complex_type]
35
- end
36
-
37
- def resolve api_map, name_pin, locals
38
- if api_map.super_and_sub?(@complex_type.name, @literal_type.name)
39
- [Pin::ProxyType.anonymous(@literal_type, source: :chain)]
40
- else
41
- # we don't support this value as a literal type
42
- [Pin::ProxyType.anonymous(@complex_type, source: :chain)]
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'parser'
4
+
5
+ module Solargraph
6
+ class Source
7
+ class Chain
8
+ class Literal < Link
9
+ def word
10
+ @word ||= "<#{@type}>"
11
+ end
12
+
13
+ attr_reader :value
14
+
15
+ # @param type [String]
16
+ # @param node [Parser::AST::Node, Object]
17
+ def initialize type, node
18
+ if node.is_a?(::Parser::AST::Node)
19
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
20
+ if node.type == :true
21
+ @value = true
22
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
23
+ elsif node.type == :false
24
+ @value = false
25
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
26
+ elsif [:int, :sym].include?(node.type)
27
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
28
+ @value = node.children.first
29
+ end
30
+ end
31
+ @type = type
32
+ @literal_type = ComplexType.try_parse(@value.inspect)
33
+ @complex_type = ComplexType.try_parse(type)
34
+ end
35
+
36
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
37
+ protected def equality_fields
38
+ # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
39
+ super + [@value, @type, @literal_type, @complex_type]
40
+ end
41
+
42
+ def resolve api_map, name_pin, locals
43
+ if api_map.super_and_sub?(@complex_type.name, @literal_type.name)
44
+ [Pin::ProxyType.anonymous(@literal_type, source: :chain)]
45
+ else
46
+ # we don't support this value as a literal type
47
+ [Pin::ProxyType.anonymous(@complex_type, source: :chain)]
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,23 +1,31 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Or < Link
7
- def word
8
- '<or>'
9
- end
10
-
11
- # @param links [::Array<Chain>]
12
- def initialize links
13
- @links = links
14
- end
15
-
16
- def resolve api_map, name_pin, locals
17
- types = @links.map { |link| link.infer(api_map, name_pin, locals) }
18
- [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.new(types.uniq), source: :chain)]
19
- end
20
- end
21
- end
22
- end
23
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Or < Link
7
+ def word
8
+ '<or>'
9
+ end
10
+
11
+ attr_reader :links
12
+
13
+ # @param links [::Array<Chain>]
14
+ def initialize links
15
+ @links = links
16
+ end
17
+
18
+ def resolve api_map, name_pin, locals
19
+ types = @links.map { |link| link.infer(api_map, name_pin, locals) }
20
+ combined_type = Solargraph::ComplexType.new(types)
21
+ unless types.all?(&:nullable?)
22
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
23
+ combined_type = combined_type.without_nil
24
+ end
25
+
26
+ [Solargraph::Pin::ProxyType.anonymous(combined_type, source: :chain)]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end