solargraph 0.58.3 → 0.59.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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +12 -5
  4. data/.github/workflows/plugins.yml +54 -34
  5. data/.github/workflows/rspec.yml +15 -28
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.rubocop.yml +38 -6
  8. data/.rubocop_todo.yml +53 -966
  9. data/CHANGELOG.md +24 -0
  10. data/Gemfile +3 -1
  11. data/README.md +3 -3
  12. data/Rakefile +26 -23
  13. data/bin/solargraph +2 -1
  14. data/lib/solargraph/api_map/cache.rb +3 -3
  15. data/lib/solargraph/api_map/constants.rb +12 -3
  16. data/lib/solargraph/api_map/index.rb +29 -18
  17. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  18. data/lib/solargraph/api_map/store.rb +40 -30
  19. data/lib/solargraph/api_map.rb +160 -78
  20. data/lib/solargraph/bench.rb +2 -3
  21. data/lib/solargraph/complex_type/conformance.rb +176 -0
  22. data/lib/solargraph/complex_type/type_methods.rb +31 -18
  23. data/lib/solargraph/complex_type/unique_type.rb +221 -63
  24. data/lib/solargraph/complex_type.rb +173 -59
  25. data/lib/solargraph/convention/active_support_concern.rb +111 -111
  26. data/lib/solargraph/convention/base.rb +50 -50
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -1
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  29. data/lib/solargraph/convention/data_definition.rb +5 -2
  30. data/lib/solargraph/convention/gemfile.rb +1 -1
  31. data/lib/solargraph/convention/gemspec.rb +1 -1
  32. data/lib/solargraph/convention/rakefile.rb +1 -1
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  35. data/lib/solargraph/convention/struct_definition.rb +8 -4
  36. data/lib/solargraph/convention.rb +2 -2
  37. data/lib/solargraph/converters/dd.rb +2 -0
  38. data/lib/solargraph/converters/dl.rb +2 -0
  39. data/lib/solargraph/converters/dt.rb +2 -0
  40. data/lib/solargraph/converters/misc.rb +2 -0
  41. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  42. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  44. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  45. data/lib/solargraph/diagnostics/update_errors.rb +4 -8
  46. data/lib/solargraph/diagnostics.rb +55 -55
  47. data/lib/solargraph/doc_map.rb +38 -39
  48. data/lib/solargraph/environ.rb +52 -52
  49. data/lib/solargraph/equality.rb +4 -4
  50. data/lib/solargraph/gem_pins.rb +4 -15
  51. data/lib/solargraph/language_server/error_codes.rb +10 -10
  52. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  53. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  54. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  55. data/lib/solargraph/language_server/host/sources.rb +2 -1
  56. data/lib/solargraph/language_server/host.rb +35 -28
  57. data/lib/solargraph/language_server/message/base.rb +1 -1
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +1 -3
  59. data/lib/solargraph/language_server/message/completion_item/resolve.rb +6 -8
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  61. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +7 -7
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +2 -1
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  65. data/lib/solargraph/language_server/message/extended/search.rb +1 -1
  66. data/lib/solargraph/language_server/message/initialize.rb +20 -14
  67. data/lib/solargraph/language_server/message/initialized.rb +28 -28
  68. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  69. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  70. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +17 -10
  71. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  72. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  73. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  74. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +13 -6
  75. data/lib/solargraph/language_server/message/text_document/references.rb +17 -10
  76. data/lib/solargraph/language_server/message/text_document/rename.rb +20 -13
  77. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  78. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  79. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  80. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +34 -28
  81. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +38 -30
  82. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +23 -17
  83. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  84. data/lib/solargraph/language_server/message.rb +1 -1
  85. data/lib/solargraph/language_server/progress.rb +143 -143
  86. data/lib/solargraph/language_server/request.rb +4 -2
  87. data/lib/solargraph/language_server/transport/adapter.rb +68 -68
  88. data/lib/solargraph/language_server/transport/data_reader.rb +11 -13
  89. data/lib/solargraph/language_server/uri_helpers.rb +2 -2
  90. data/lib/solargraph/language_server.rb +20 -20
  91. data/lib/solargraph/library.rb +57 -38
  92. data/lib/solargraph/location.rb +17 -14
  93. data/lib/solargraph/logging.rb +22 -4
  94. data/lib/solargraph/page.rb +1 -1
  95. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  96. data/lib/solargraph/parser/flow_sensitive_typing.rb +324 -108
  97. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  98. data/lib/solargraph/parser/node_processor.rb +8 -7
  99. data/lib/solargraph/parser/parser_gem/class_methods.rb +30 -14
  100. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -1
  101. data/lib/solargraph/parser/parser_gem/node_chainer.rb +51 -25
  102. data/lib/solargraph/parser/parser_gem/node_methods.rb +181 -73
  103. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +24 -24
  104. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  105. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  106. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -12
  108. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +36 -36
  109. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +24 -24
  110. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  111. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +9 -8
  112. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +24 -24
  113. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  114. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  115. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  116. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  117. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +40 -40
  118. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  119. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  120. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  121. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  122. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  123. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  124. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +20 -20
  125. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +1 -1
  126. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  127. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  128. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  129. data/lib/solargraph/parser/parser_gem.rb +2 -0
  130. data/lib/solargraph/parser/region.rb +9 -3
  131. data/lib/solargraph/parser/snippet.rb +3 -1
  132. data/lib/solargraph/parser.rb +2 -0
  133. data/lib/solargraph/pin/base.rb +126 -82
  134. data/lib/solargraph/pin/base_variable.rb +273 -24
  135. data/lib/solargraph/pin/block.rb +29 -6
  136. data/lib/solargraph/pin/breakable.rb +7 -1
  137. data/lib/solargraph/pin/callable.rb +65 -21
  138. data/lib/solargraph/pin/closure.rb +7 -10
  139. data/lib/solargraph/pin/common.rb +24 -6
  140. data/lib/solargraph/pin/compound_statement.rb +55 -0
  141. data/lib/solargraph/pin/constant.rb +3 -5
  142. data/lib/solargraph/pin/conversions.rb +10 -4
  143. data/lib/solargraph/pin/delegated_method.rb +19 -8
  144. data/lib/solargraph/pin/documenting.rb +4 -2
  145. data/lib/solargraph/pin/instance_variable.rb +5 -1
  146. data/lib/solargraph/pin/keyword.rb +0 -4
  147. data/lib/solargraph/pin/local_variable.rb +15 -59
  148. data/lib/solargraph/pin/method.rb +158 -104
  149. data/lib/solargraph/pin/method_alias.rb +8 -0
  150. data/lib/solargraph/pin/namespace.rb +19 -12
  151. data/lib/solargraph/pin/parameter.rb +102 -36
  152. data/lib/solargraph/pin/proxy_type.rb +4 -1
  153. data/lib/solargraph/pin/reference/override.rb +1 -1
  154. data/lib/solargraph/pin/reference/require.rb +14 -14
  155. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  156. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  157. data/lib/solargraph/pin/reference.rb +20 -0
  158. data/lib/solargraph/pin/search.rb +8 -7
  159. data/lib/solargraph/pin/signature.rb +15 -12
  160. data/lib/solargraph/pin/singleton.rb +11 -11
  161. data/lib/solargraph/pin/symbol.rb +2 -1
  162. data/lib/solargraph/pin/until.rb +2 -4
  163. data/lib/solargraph/pin/while.rb +2 -4
  164. data/lib/solargraph/pin.rb +2 -0
  165. data/lib/solargraph/pin_cache.rb +22 -19
  166. data/lib/solargraph/position.rb +17 -10
  167. data/lib/solargraph/range.rb +16 -15
  168. data/lib/solargraph/rbs_map/conversions.rb +367 -231
  169. data/lib/solargraph/rbs_map/core_fills.rb +18 -11
  170. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  171. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  172. data/lib/solargraph/rbs_map.rb +76 -32
  173. data/lib/solargraph/server_methods.rb +1 -1
  174. data/lib/solargraph/shell.rb +258 -66
  175. data/lib/solargraph/source/chain/array.rb +3 -12
  176. data/lib/solargraph/source/chain/block_symbol.rb +13 -13
  177. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/call.rb +96 -56
  179. data/lib/solargraph/source/chain/class_variable.rb +1 -1
  180. data/lib/solargraph/source/chain/constant.rb +5 -1
  181. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  182. data/lib/solargraph/source/chain/hash.rb +8 -5
  183. data/lib/solargraph/source/chain/head.rb +19 -19
  184. data/lib/solargraph/source/chain/if.rb +12 -10
  185. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  186. data/lib/solargraph/source/chain/link.rb +12 -22
  187. data/lib/solargraph/source/chain/literal.rb +22 -15
  188. data/lib/solargraph/source/chain/or.rb +10 -4
  189. data/lib/solargraph/source/chain/q_call.rb +2 -0
  190. data/lib/solargraph/source/chain/variable.rb +3 -1
  191. data/lib/solargraph/source/chain/z_super.rb +1 -3
  192. data/lib/solargraph/source/chain.rb +51 -38
  193. data/lib/solargraph/source/change.rb +12 -5
  194. data/lib/solargraph/source/cursor.rb +33 -18
  195. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  196. data/lib/solargraph/source/source_chainer.rb +56 -32
  197. data/lib/solargraph/source/updater.rb +5 -1
  198. data/lib/solargraph/source.rb +59 -35
  199. data/lib/solargraph/source_map/clip.rb +54 -30
  200. data/lib/solargraph/source_map/data.rb +4 -1
  201. data/lib/solargraph/source_map/mapper.rb +69 -42
  202. data/lib/solargraph/source_map.rb +21 -9
  203. data/lib/solargraph/type_checker/problem.rb +3 -1
  204. data/lib/solargraph/type_checker/rules.rb +81 -8
  205. data/lib/solargraph/type_checker.rb +196 -122
  206. data/lib/solargraph/version.rb +1 -1
  207. data/lib/solargraph/workspace/config.rb +14 -11
  208. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  209. data/lib/solargraph/workspace/require_paths.rb +1 -0
  210. data/lib/solargraph/workspace.rb +50 -28
  211. data/lib/solargraph/yard_map/cache.rb +25 -25
  212. data/lib/solargraph/yard_map/helpers.rb +8 -3
  213. data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
  214. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  215. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  216. data/lib/solargraph/yard_map/mapper.rb +13 -8
  217. data/lib/solargraph/yard_map.rb +17 -18
  218. data/lib/solargraph/yard_tags.rb +2 -2
  219. data/lib/solargraph/yardoc.rb +7 -4
  220. data/lib/solargraph.rb +33 -10
  221. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  222. data/rbs/shims/ast/0/node.rbs +1 -1
  223. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  224. data/solargraph.gemspec +37 -35
  225. metadata +41 -42
  226. data/lib/solargraph/type_checker/checks.rb +0 -124
  227. data/lib/solargraph/type_checker/param_def.rb +0 -37
  228. data/lib/solargraph/yard_map/to_method.rb +0 -89
  229. data/rbs/fills/tuple/tuple.rbs +0 -149
@@ -35,27 +35,28 @@ module Solargraph
35
35
  # @param node [Parser::AST::Node]
36
36
  # @param region [Region]
37
37
  # @param pins [Array<Pin::Base>]
38
- # @param locals [Array<Pin::BaseVariable>]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
40
- def self.process node, region = Region.new, pins = [], locals = []
38
+ # @param locals [Array<Pin::LocalVariable>]
39
+ # @param ivars [Array<Pin::InstanceVariable>]
40
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>, Array<Pin::InstanceVariable>)]
41
+ def self.process node, region = Region.new, pins = [], locals = [], ivars = []
41
42
  if pins.empty?
42
43
  pins.push Pin::Namespace.new(
43
44
  location: region.source.location,
44
45
  name: '',
45
- source: :parser,
46
+ source: :parser
46
47
  )
47
48
  end
48
- return [pins, locals] unless Parser.is_ast_node?(node)
49
+ return [pins, locals, ivars] unless Parser.is_ast_node?(node)
49
50
  node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
50
51
 
51
52
  node_processor_classes.each do |klass|
52
- processor = klass.new(node, region, pins, locals)
53
+ processor = klass.new(node, region, pins, locals, ivars)
53
54
  process_next = processor.process
54
55
 
55
56
  break unless process_next
56
57
  end
57
58
 
58
- [pins, locals]
59
+ [pins, locals, ivars]
59
60
  end
60
61
  end
61
62
  end
@@ -8,19 +8,23 @@ module Solargraph
8
8
  module ClassMethods
9
9
  # @param code [String]
10
10
  # @param filename [String, nil]
11
+ # @param starting_line [Integer] must be provided so that we
12
+ # can find relevant local variables later even if this is just
13
+ # a subset of the file in question
11
14
  # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
12
- def parse_with_comments code, filename = nil
13
- node = parse(code, filename)
15
+ def parse_with_comments code, filename = nil, starting_line = 0
16
+ node = parse(code, filename, starting_line)
14
17
  comments = CommentRipper.new(code, filename, 0).parse
15
18
  [node, comments]
16
19
  end
17
20
 
18
21
  # @param code [String]
19
22
  # @param filename [String, nil]
20
- # @param line [Integer]
23
+ # @param starting_line [Integer]
24
+ # @sg-ignore need to understand that raise does not return
21
25
  # @return [Parser::AST::Node]
22
- def parse code, filename = nil, line = 0
23
- buffer = ::Parser::Source::Buffer.new(filename, line)
26
+ def parse code, filename = nil, starting_line = 0
27
+ buffer = ::Parser::Source::Buffer.new(filename, starting_line)
24
28
  buffer.source = code
25
29
  parser.parse(buffer)
26
30
  rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
@@ -36,29 +40,35 @@ module Solargraph
36
40
  end
37
41
 
38
42
  # @param source [Source]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
43
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
40
44
  def map source
41
- NodeProcessor.process(source.node, Region.new(source: source))
45
+ # @sg-ignore Need to add nil check here
46
+ pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
47
+ pins.concat(ivars)
48
+ [pins, locals]
42
49
  end
43
50
 
44
51
  # @param source [Source]
45
52
  # @param name [String]
46
53
  # @return [Array<Location>]
47
54
  def references source, name
48
- if name.end_with?("=")
55
+ if name.end_with?('=')
49
56
  reg = /#{Regexp.escape name[0..-2]}\s*=/
50
57
  # @param code [String]
51
58
  # @param offset [Integer]
52
59
  # @return [Array(Integer, Integer), Array(nil, nil)]
60
+ # @sg-ignore Need to add nil check here
53
61
  extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
54
62
  else
55
63
  # @param code [String]
56
64
  # @param offset [Integer]
57
65
  # @return [Array(Integer, Integer), Array(nil, nil)]
66
+ # @sg-ignore Need to add nil check here
58
67
  extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
59
68
  end
60
69
  inner_node_references(name, source.node).map do |n|
61
70
  rng = Range.from_node(n)
71
+ # @sg-ignore Need to add nil check here
62
72
  offset = Position.to_offset(source.code, rng.start)
63
73
  soff, eoff = extract_offset[source.code, offset]
64
74
  Location.new(
@@ -86,20 +96,20 @@ module Solargraph
86
96
 
87
97
  # @return [Source::Chain]
88
98
  def chain *args
89
- NodeChainer.chain *args
99
+ NodeChainer.chain(*args)
90
100
  end
91
101
 
92
102
  # @return [Source::Chain]
93
103
  def chain_string *args
94
- NodeChainer.load_string *args
104
+ NodeChainer.load_string(*args)
95
105
  end
96
106
 
97
107
  # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
98
108
  def process_node *args
99
- Solargraph::Parser::NodeProcessor.process *args
109
+ Solargraph::Parser::NodeProcessor.process(*args)
100
110
  end
101
111
 
102
- # @param node [Parser::AST::Node]
112
+ # @param node [Parser::AST::Node, nil]
103
113
  # @return [String, nil]
104
114
  def infer_literal_node_type node
105
115
  NodeMethods.infer_literal_node_type node
@@ -110,7 +120,7 @@ module Solargraph
110
120
  parser.version
111
121
  end
112
122
 
113
- # @param node [BasicObject]
123
+ # @param node [BasicObject, nil]
114
124
  # @return [Boolean]
115
125
  def is_ast_node? node
116
126
  node.is_a?(::Parser::AST::Node)
@@ -124,19 +134,25 @@ module Solargraph
124
134
  Range.new(st, en)
125
135
  end
126
136
 
127
- # @param node [Parser::AST::Node]
137
+ # @param node [Parser::AST::Node, nil]
128
138
  # @return [Array<Range>]
129
139
  def string_ranges node
130
140
  return [] unless is_ast_node?(node)
131
141
  result = []
142
+ # @sg-ignore Translate to something flow sensitive typing understands
132
143
  result.push Range.from_node(node) if node.type == :str
144
+ # @sg-ignore Translate to something flow sensitive typing understands
133
145
  node.children.each do |child|
134
146
  result.concat string_ranges(child)
135
147
  end
148
+ # @sg-ignore Translate to something flow sensitive typing understands
136
149
  if node.type == :dstr && node.children.last.nil?
150
+ # @sg-ignore Translate to something flow sensitive typing understands
137
151
  last = node.children[-2]
152
+ # @sg-ignore Need to add nil check here
138
153
  unless last.nil?
139
154
  rng = Range.from_node(last)
155
+ # @sg-ignore Need to add nil check here
140
156
  pos = Position.new(rng.ending.line, rng.ending.column - 1)
141
157
  result.push Range.new(pos, pos)
142
158
  end
@@ -10,7 +10,7 @@ module Solargraph
10
10
  # @param token [::Parser::AST::Node]
11
11
  # @return [String]
12
12
  # @sg-ignore
13
- def string_value(token)
13
+ def string_value token
14
14
  value(token)
15
15
  end
16
16
  end
@@ -22,7 +22,7 @@ module Solargraph
22
22
  # @return [Source::Chain]
23
23
  def chain
24
24
  links = generate_links(@node)
25
- Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :splat))
25
+ Chain.new(links, @node, Parser.is_ast_node?(@node) && @node.type == :splat)
26
26
  end
27
27
 
28
28
  class << self
@@ -35,9 +35,12 @@ module Solargraph
35
35
  end
36
36
 
37
37
  # @param code [String]
38
+ # @param filename [String]
39
+ # @param starting_line [Integer]
40
+ #
38
41
  # @return [Source::Chain]
39
- def load_string(code)
40
- node = Parser.parse(code.sub(/\.$/, ''))
42
+ def load_string code, filename, starting_line
43
+ node = Parser.parse(code.sub(/\.$/, ''), filename, starting_line)
41
44
  chain = NodeChainer.new(node).chain
42
45
  chain.links.push(Chain::Link.new) if code.end_with?('.')
43
46
  chain
@@ -60,9 +63,9 @@ module Solargraph
60
63
  result.concat generate_links(n.children[0])
61
64
  result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
62
65
  elsif n.children[0].nil?
63
- args = []
64
- n.children[2..-1].each do |c|
65
- args.push NodeChainer.chain(c, @filename, n)
66
+ # @sg-ignore Need to add nil check here
67
+ n.children[2..].map do |c|
68
+ NodeChainer.chain(c, @filename, n)
66
69
  end
67
70
  result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
68
71
  else
@@ -90,27 +93,46 @@ module Solargraph
90
93
  elsif n.type == :const
91
94
  const = unpack_name(n)
92
95
  result.push Chain::Constant.new(const)
93
- elsif [:lvar, :lvasgn].include?(n.type)
96
+ elsif %i[lvar lvasgn].include?(n.type)
94
97
  result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
95
- elsif [:ivar, :ivasgn].include?(n.type)
96
- result.push Chain::InstanceVariable.new(n.children[0].to_s)
97
- elsif [:cvar, :cvasgn].include?(n.type)
98
+ elsif %i[ivar ivasgn].include?(n.type)
99
+ result.push Chain::InstanceVariable.new(n.children[0].to_s, n, Location.from_node(n))
100
+ elsif %i[cvar cvasgn].include?(n.type)
98
101
  result.push Chain::ClassVariable.new(n.children[0].to_s)
99
- elsif [:gvar, :gvasgn].include?(n.type)
102
+ elsif %i[gvar gvasgn].include?(n.type)
100
103
  result.push Chain::GlobalVariable.new(n.children[0].to_s)
101
104
  elsif n.type == :or_asgn
102
- new_node = n.updated(n.children[0].type, n.children[0].children + [n.children[1]])
103
- result.concat generate_links new_node
104
- elsif [:class, :module, :def, :defs].include?(n.type)
105
+ # @bar ||= 123 translates to:
106
+ #
107
+ # s(:or_asgn,
108
+ # s(:ivasgn, :@bar),
109
+ # s(:int, 123))
110
+ lhs_chain = NodeChainer.chain n.children[0] # s(:ivasgn, :@bar)
111
+ rhs_chain = NodeChainer.chain n.children[1] # s(:int, 123)
112
+ or_link = Chain::Or.new([lhs_chain, rhs_chain])
113
+ # this is just for a call chain, so we don't need to record the assignment
114
+ result.push(or_link)
115
+ elsif %i[class module def defs].include?(n.type)
105
116
  # @todo Undefined or what?
106
117
  result.push Chain::UNDEFINED_CALL
107
118
  elsif n.type == :and
108
119
  result.concat generate_links(n.children.last)
109
120
  elsif n.type == :or
110
- result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename, n)])
121
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename),
122
+ NodeChainer.chain(n.children[1], @filename, n)])
111
123
  elsif n.type == :if
112
- result.push Chain::If.new([NodeChainer.chain(n.children[1], @filename), NodeChainer.chain(n.children[2], @filename, n)])
113
- elsif [:begin, :kwbegin].include?(n.type)
124
+ then_clause = if n.children[1]
125
+ NodeChainer.chain(n.children[1], @filename, n)
126
+ else
127
+ Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
128
+ end
129
+ else_clause = if n.children[2]
130
+ NodeChainer.chain(n.children[2], @filename, n)
131
+ else
132
+ Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
133
+ end
134
+ result.push Chain::If.new([then_clause, else_clause])
135
+ elsif %i[begin kwbegin].include?(n.type)
114
136
  result.concat generate_links(n.children.last)
115
137
  elsif n.type == :block_pass
116
138
  block_variable_name_node = n.children[0]
@@ -118,12 +140,10 @@ module Solargraph
118
140
  # anonymous block forwarding (e.g., "&")
119
141
  # added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
120
142
  result.push Chain::BlockVariable.new(nil)
143
+ elsif block_variable_name_node.type == :sym
144
+ result.push Chain::BlockSymbol.new(block_variable_name_node.children[0].to_s)
121
145
  else
122
- if block_variable_name_node.type == :sym
123
- result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
124
- else
125
- result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
126
- end
146
+ result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0]}")
127
147
  end
128
148
  elsif n.type == :hash
129
149
  result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
@@ -132,7 +152,8 @@ module Solargraph
132
152
  result.push Source::Chain::Array.new(chained_children, n)
133
153
  else
134
154
  lit = infer_literal_node_type(n)
135
- result.push (lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
155
+ result.push(lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
156
+ # result.push Chain::Link.new
136
157
  end
137
158
  result
138
159
  end
@@ -141,7 +162,9 @@ module Solargraph
141
162
  def hash_is_splatted? node
142
163
  return false unless Parser.is_ast_node?(node) && node.type == :hash
143
164
  return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
144
- return false if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
165
+ if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
166
+ return false
167
+ end
145
168
  true
146
169
  end
147
170
 
@@ -150,13 +173,16 @@ module Solargraph
150
173
  def passed_block node
151
174
  return unless node == @node && @parent&.type == :block
152
175
 
176
+ # @sg-ignore Need to add nil check here
153
177
  NodeChainer.chain(@parent.children[2], @filename)
154
178
  end
155
179
 
156
180
  # @param node [Parser::AST::Node]
181
+ # @sg-ignore Need to add nil check here
157
182
  # @return [Array<Source::Chain>]
158
183
  def node_args node
159
- node.children[2..-1].map do |child|
184
+ # @sg-ignore Need to add nil check here
185
+ node.children[2..].map do |child|
160
186
  NodeChainer.chain(child, @filename, node)
161
187
  end
162
188
  end