solargraph 0.54.4 → 0.58.2

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +184 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +140 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +18 -1
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  35. data/lib/solargraph/convention/struct_definition.rb +164 -0
  36. data/lib/solargraph/convention.rb +35 -4
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -188
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -72
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -861
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  53. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  56. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  57. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  58. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  59. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  60. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  61. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  62. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  63. data/lib/solargraph/language_server/progress.rb +8 -0
  64. data/lib/solargraph/language_server/request.rb +4 -1
  65. data/lib/solargraph/library.rb +683 -662
  66. data/lib/solargraph/location.rb +82 -58
  67. data/lib/solargraph/logging.rb +37 -27
  68. data/lib/solargraph/page.rb +3 -0
  69. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  70. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  71. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  72. data/lib/solargraph/parser/node_processor.rb +62 -45
  73. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  74. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  75. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  76. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  77. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  79. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  80. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  81. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  82. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  83. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  85. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  86. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  89. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  90. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  91. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  92. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  94. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  95. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  96. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  97. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  101. data/lib/solargraph/parser/region.rb +69 -66
  102. data/lib/solargraph/parser/snippet.rb +17 -15
  103. data/lib/solargraph/parser.rb +1 -0
  104. data/lib/solargraph/pin/base.rb +729 -378
  105. data/lib/solargraph/pin/base_variable.rb +126 -118
  106. data/lib/solargraph/pin/block.rb +104 -101
  107. data/lib/solargraph/pin/breakable.rb +9 -0
  108. data/lib/solargraph/pin/callable.rb +231 -147
  109. data/lib/solargraph/pin/closure.rb +72 -57
  110. data/lib/solargraph/pin/common.rb +79 -70
  111. data/lib/solargraph/pin/constant.rb +2 -0
  112. data/lib/solargraph/pin/conversions.rb +123 -123
  113. data/lib/solargraph/pin/delegated_method.rb +120 -101
  114. data/lib/solargraph/pin/documenting.rb +114 -98
  115. data/lib/solargraph/pin/instance_variable.rb +34 -34
  116. data/lib/solargraph/pin/keyword.rb +20 -15
  117. data/lib/solargraph/pin/local_variable.rb +75 -67
  118. data/lib/solargraph/pin/method.rb +672 -527
  119. data/lib/solargraph/pin/method_alias.rb +34 -31
  120. data/lib/solargraph/pin/namespace.rb +115 -107
  121. data/lib/solargraph/pin/parameter.rb +275 -212
  122. data/lib/solargraph/pin/proxy_type.rb +39 -29
  123. data/lib/solargraph/pin/reference/override.rb +47 -29
  124. data/lib/solargraph/pin/reference/require.rb +2 -2
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  126. data/lib/solargraph/pin/reference.rb +39 -22
  127. data/lib/solargraph/pin/search.rb +61 -56
  128. data/lib/solargraph/pin/signature.rb +61 -17
  129. data/lib/solargraph/pin/singleton.rb +1 -1
  130. data/lib/solargraph/pin/symbol.rb +53 -47
  131. data/lib/solargraph/pin/until.rb +18 -0
  132. data/lib/solargraph/pin/while.rb +18 -0
  133. data/lib/solargraph/pin.rb +44 -41
  134. data/lib/solargraph/pin_cache.rb +245 -0
  135. data/lib/solargraph/position.rb +132 -107
  136. data/lib/solargraph/range.rb +112 -98
  137. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  138. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  139. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  140. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  141. data/lib/solargraph/rbs_map.rb +163 -93
  142. data/lib/solargraph/shell.rb +352 -269
  143. data/lib/solargraph/source/chain/array.rb +11 -7
  144. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  145. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  146. data/lib/solargraph/source/chain/call.rb +337 -303
  147. data/lib/solargraph/source/chain/constant.rb +26 -89
  148. data/lib/solargraph/source/chain/hash.rb +34 -33
  149. data/lib/solargraph/source/chain/head.rb +1 -1
  150. data/lib/solargraph/source/chain/if.rb +28 -28
  151. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  152. data/lib/solargraph/source/chain/link.rb +13 -2
  153. data/lib/solargraph/source/chain/literal.rb +48 -28
  154. data/lib/solargraph/source/chain/or.rb +23 -23
  155. data/lib/solargraph/source/chain/z_super.rb +1 -1
  156. data/lib/solargraph/source/chain.rb +291 -252
  157. data/lib/solargraph/source/change.rb +82 -82
  158. data/lib/solargraph/source/cursor.rb +166 -167
  159. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -495
  163. data/lib/solargraph/source_map/clip.rb +226 -232
  164. data/lib/solargraph/source_map/data.rb +34 -30
  165. data/lib/solargraph/source_map/mapper.rb +259 -255
  166. data/lib/solargraph/source_map.rb +212 -217
  167. data/lib/solargraph/type_checker/checks.rb +124 -120
  168. data/lib/solargraph/type_checker/param_def.rb +37 -35
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -62
  171. data/lib/solargraph/type_checker.rb +814 -672
  172. data/lib/solargraph/version.rb +5 -5
  173. data/lib/solargraph/views/_method.erb +10 -10
  174. data/lib/solargraph/views/_namespace.erb +3 -3
  175. data/lib/solargraph/views/document.erb +10 -10
  176. data/lib/solargraph/workspace/config.rb +255 -239
  177. data/lib/solargraph/workspace/require_paths.rb +97 -0
  178. data/lib/solargraph/workspace.rb +220 -239
  179. data/lib/solargraph/yard_map/helpers.rb +44 -16
  180. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  181. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  182. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  183. data/lib/solargraph/yard_map/mapper.rb +79 -78
  184. data/lib/solargraph/yard_map/to_method.rb +89 -86
  185. data/lib/solargraph/yardoc.rb +87 -52
  186. data/lib/solargraph.rb +105 -72
  187. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  188. data/rbs/fills/open3/0/open3.rbs +172 -0
  189. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  190. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  191. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  192. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  193. data/rbs/fills/tuple/tuple.rbs +149 -0
  194. data/rbs/shims/ast/0/node.rbs +5 -0
  195. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  196. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  197. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  198. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  199. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  200. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  201. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  202. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  203. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  204. data/rbs_collection.yaml +19 -0
  205. data/solargraph.gemspec +27 -5
  206. metadata +215 -18
  207. data/lib/.rubocop.yml +0 -22
  208. data/lib/solargraph/cache.rb +0 -77
  209. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,89 +1,26 @@
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 = crawl_gates(name_pin)
19
- end
20
- parts = base.split('::')
21
- gates.each do |gate|
22
- # @todo 'Wrong argument type for
23
- # Solargraph::Source::Chain::Constant#deep_constant_type:
24
- # gate expected String, received generic<Elem>' is because
25
- # we lose 'rooted' information in the 'Chain::Array' class
26
- # internally, leaving ::Array#each shadowed when it
27
- # shouldn't be.
28
- type = deep_constant_type(gate, api_map)
29
- # Use deep inference to resolve root
30
- parts[0..-2].each do |sym|
31
- pins = api_map.get_constants('', type.namespace).select{ |pin| pin.name == sym }
32
- type = first_pin_type(pins, api_map)
33
- break if type.undefined?
34
- end
35
- next if type.undefined?
36
- result = api_map.get_constants('', type.namespace).select { |pin| pin.name == parts.last }
37
- return result unless result.empty?
38
- end
39
- []
40
- end
41
-
42
- private
43
-
44
- # @param pin [Pin::Base]
45
- # @return [::Array<String>]
46
- def crawl_gates pin
47
- clos = pin
48
- until clos.nil?
49
- if clos.is_a?(Pin::Namespace)
50
- gates = clos.gates
51
- gates.push('') if gates.empty?
52
- return gates
53
- end
54
- clos = clos.closure
55
- end
56
- ['']
57
- end
58
-
59
- # @param pins [::Array<Pin::Base>]
60
- # @param api_map [ApiMap]
61
- # @return [ComplexType]
62
- def first_pin_type(pins, api_map)
63
- type = ComplexType::UNDEFINED
64
- pins.each do |pin|
65
- type = pin.typify(api_map)
66
- break if type.defined?
67
- type = pin.probe(api_map)
68
- break if type.defined?
69
- end
70
- type
71
- end
72
-
73
- # @param gate [String]
74
- # @param api_map [ApiMap]
75
- # @return [ComplexType]
76
- def deep_constant_type(gate, api_map)
77
- type = ComplexType::ROOT
78
- return type if gate == ''
79
- gate.split('::').each do |word|
80
- pins = api_map.get_constants('', type.namespace).select { |pin| pin.name == word }
81
- type = first_pin_type(pins, api_map)
82
- break if type.undefined?
83
- end
84
- type
85
- end
86
- end
87
- end
88
- end
89
- 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
+ fqns = api_map.resolve(base, gates)
21
+ api_map.get_path_pins(fqns)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,33 +1,34 @@
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 splatted [Boolean]
9
- def initialize type, splatted = false
10
- super(type)
11
- @splatted = splatted
12
- end
13
-
14
- # @sg-ignore Fix "Not enough arguments to Module#protected"
15
- protected def equality_fields
16
- super + [@splatted]
17
- end
18
-
19
- def word
20
- @word ||= "<#{@type}>"
21
- end
22
-
23
- def resolve api_map, name_pin, locals
24
- [Pin::ProxyType.anonymous(@complex_type)]
25
- end
26
-
27
- def splatted?
28
- @splatted
29
- end
30
- end
31
- end
32
- end
33
- 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
+ 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
@@ -9,7 +9,7 @@ module Solargraph
9
9
  # @note Chain::Head is only intended to handle `self` and `super`.
10
10
  class Head < Link
11
11
  def resolve api_map, name_pin, locals
12
- return [Pin::ProxyType.anonymous(name_pin.binder)] if word == 'self'
12
+ return [Pin::ProxyType.anonymous(name_pin.binder, source: :chain)] if word == 'self'
13
13
  # return super_pins(api_map, name_pin) if word == 'super'
14
14
  []
15
15
  end
@@ -1,28 +1,28 @@
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<Link>]
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(', ')))]
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
+ 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,13 +1,13 @@
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
+ 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
@@ -17,7 +17,13 @@ module Solargraph
17
17
  @word = word
18
18
  end
19
19
 
20
- # @sg-ignore Fix "Not enough arguments to Module#protected"
20
+ # @sg-ignore two problems - Declared return type
21
+ # ::Solargraph::Source::Chain::Array does not match inferred
22
+ # type ::Array(::Class<::Solargraph::Source::Chain::Link>,
23
+ # ::String) for
24
+ # Solargraph::Source::Chain::Link#equality_fields
25
+ # and
26
+ # Not enough arguments to Module#protected
21
27
  protected def equality_fields
22
28
  [self.class, word]
23
29
  end
@@ -32,13 +38,14 @@ module Solargraph
32
38
 
33
39
  # @param api_map [ApiMap]
34
40
  # @param name_pin [Pin::Base]
35
- # @param locals [::Enumerable<Pin::Base>]
41
+ # @param locals [::Array<Pin::Base>]
36
42
  # @return [::Array<Pin::Base>]
37
43
  def resolve api_map, name_pin, locals
38
44
  []
39
45
  end
40
46
 
41
47
  # debugging description of contents; not for machine use
48
+ # @return [String]
42
49
  def desc
43
50
  word
44
51
  end
@@ -74,6 +81,8 @@ module Solargraph
74
81
  end
75
82
 
76
83
  # debugging description of contents; not for machine use
84
+ #
85
+ # @return [String]
77
86
  def desc
78
87
  word
79
88
  end
@@ -82,6 +91,8 @@ module Solargraph
82
91
  "#<#{self.class} - `#{self.desc}`>"
83
92
  end
84
93
 
94
+ include Logging
95
+
85
96
  protected
86
97
 
87
98
  # Mark whether this link is the head of a chain
@@ -1,28 +1,48 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Literal < Link
7
- def word
8
- @word ||= "<#{@type}>"
9
- end
10
-
11
- # @param type [String]
12
- def initialize type
13
- @type = type
14
- @complex_type = ComplexType.try_parse(type)
15
- end
16
-
17
- # @sg-ignore Fix "Not enough arguments to Module#protected"
18
- protected def equality_fields
19
- super + [@value, @type, @literal_type, @complex_type]
20
- end
21
-
22
- def resolve api_map, name_pin, locals
23
- [Pin::ProxyType.anonymous(@complex_type)]
24
- end
25
- end
26
- end
27
- end
28
- 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
+ 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,23 +1,23 @@
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<Link>]
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))]
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
+ # @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
@@ -15,7 +15,7 @@ module Solargraph
15
15
  # @param with_block [Boolean] True if the chain is inside a block
16
16
  # @param head [Boolean] True if the call is the start of its chain
17
17
  def initialize word, with_block = false
18
- super(word, [], with_block)
18
+ super(word, nil, [], with_block)
19
19
  end
20
20
 
21
21
  # @param api_map [ApiMap]