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,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