solargraph 0.58.2 → 0.59.0.dev.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 (203) 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 +41 -34
  5. data/.github/workflows/rspec.yml +44 -23
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop.yml +32 -5
  8. data/.rubocop_todo.yml +50 -966
  9. data/Gemfile +3 -1
  10. data/README.md +3 -3
  11. data/Rakefile +26 -23
  12. data/bin/solargraph +2 -1
  13. data/lib/solargraph/api_map/cache.rb +3 -3
  14. data/lib/solargraph/api_map/constants.rb +13 -3
  15. data/lib/solargraph/api_map/index.rb +23 -18
  16. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  17. data/lib/solargraph/api_map/store.rb +33 -28
  18. data/lib/solargraph/api_map.rb +150 -82
  19. data/lib/solargraph/bench.rb +44 -45
  20. data/lib/solargraph/complex_type/conformance.rb +176 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +28 -17
  22. data/lib/solargraph/complex_type/unique_type.rb +218 -57
  23. data/lib/solargraph/complex_type.rb +170 -57
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  26. data/lib/solargraph/convention/data_definition.rb +5 -2
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  32. data/lib/solargraph/convention/struct_definition.rb +8 -4
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +19 -17
  35. data/lib/solargraph/converters/dl.rb +17 -15
  36. data/lib/solargraph/converters/dt.rb +17 -15
  37. data/lib/solargraph/converters/misc.rb +3 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  41. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  42. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  43. data/lib/solargraph/doc_map.rb +133 -373
  44. data/lib/solargraph/equality.rb +4 -4
  45. data/lib/solargraph/gem_pins.rb +21 -20
  46. data/lib/solargraph/language_server/error_codes.rb +20 -20
  47. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  48. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  49. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  50. data/lib/solargraph/language_server/host/sources.rb +2 -1
  51. data/lib/solargraph/language_server/host.rb +30 -22
  52. data/lib/solargraph/language_server/message/base.rb +97 -97
  53. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  55. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  56. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  57. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  58. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  59. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  60. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  61. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  62. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  63. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  64. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  65. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  66. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  67. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  68. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  69. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  70. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  71. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  72. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  73. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  74. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  75. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  76. data/lib/solargraph/language_server/message.rb +94 -94
  77. data/lib/solargraph/language_server/request.rb +29 -27
  78. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  79. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  80. data/lib/solargraph/library.rb +85 -44
  81. data/lib/solargraph/location.rb +17 -14
  82. data/lib/solargraph/logging.rb +24 -4
  83. data/lib/solargraph/page.rb +92 -92
  84. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  85. data/lib/solargraph/parser/flow_sensitive_typing.rb +326 -108
  86. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  87. data/lib/solargraph/parser/node_processor.rb +8 -7
  88. data/lib/solargraph/parser/parser_gem/class_methods.rb +32 -14
  89. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  90. data/lib/solargraph/parser/parser_gem/node_chainer.rb +50 -25
  91. data/lib/solargraph/parser/parser_gem/node_methods.rb +91 -70
  92. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  93. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  94. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  95. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +12 -12
  96. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  97. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  98. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  99. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  100. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  102. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  103. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  104. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  107. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  108. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  109. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  112. data/lib/solargraph/parser/parser_gem.rb +14 -12
  113. data/lib/solargraph/parser/region.rb +9 -3
  114. data/lib/solargraph/parser/snippet.rb +3 -1
  115. data/lib/solargraph/parser.rb +25 -23
  116. data/lib/solargraph/pin/base.rb +126 -80
  117. data/lib/solargraph/pin/base_variable.rb +273 -24
  118. data/lib/solargraph/pin/block.rb +29 -6
  119. data/lib/solargraph/pin/breakable.rb +7 -1
  120. data/lib/solargraph/pin/callable.rb +65 -21
  121. data/lib/solargraph/pin/closure.rb +7 -10
  122. data/lib/solargraph/pin/common.rb +24 -6
  123. data/lib/solargraph/pin/compound_statement.rb +55 -0
  124. data/lib/solargraph/pin/constant.rb +43 -45
  125. data/lib/solargraph/pin/conversions.rb +10 -4
  126. data/lib/solargraph/pin/delegated_method.rb +19 -8
  127. data/lib/solargraph/pin/documenting.rb +4 -2
  128. data/lib/solargraph/pin/instance_variable.rb +5 -1
  129. data/lib/solargraph/pin/keyword.rb +0 -4
  130. data/lib/solargraph/pin/local_variable.rb +15 -59
  131. data/lib/solargraph/pin/method.rb +153 -104
  132. data/lib/solargraph/pin/method_alias.rb +8 -0
  133. data/lib/solargraph/pin/namespace.rb +19 -12
  134. data/lib/solargraph/pin/parameter.rb +100 -36
  135. data/lib/solargraph/pin/proxy_type.rb +4 -1
  136. data/lib/solargraph/pin/reference/override.rb +1 -1
  137. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  138. data/lib/solargraph/pin/reference.rb +19 -0
  139. data/lib/solargraph/pin/search.rb +3 -2
  140. data/lib/solargraph/pin/signature.rb +15 -12
  141. data/lib/solargraph/pin/symbol.rb +2 -1
  142. data/lib/solargraph/pin/until.rb +2 -4
  143. data/lib/solargraph/pin/while.rb +2 -4
  144. data/lib/solargraph/pin.rb +2 -0
  145. data/lib/solargraph/pin_cache.rb +490 -73
  146. data/lib/solargraph/position.rb +14 -10
  147. data/lib/solargraph/range.rb +16 -15
  148. data/lib/solargraph/rbs_map/conversions.rb +343 -214
  149. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  150. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  151. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  152. data/lib/solargraph/rbs_map.rb +77 -32
  153. data/lib/solargraph/server_methods.rb +16 -16
  154. data/lib/solargraph/shell.rb +128 -73
  155. data/lib/solargraph/source/chain/array.rb +39 -37
  156. data/lib/solargraph/source/chain/call.rb +96 -56
  157. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  158. data/lib/solargraph/source/chain/constant.rb +5 -1
  159. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  160. data/lib/solargraph/source/chain/hash.rb +8 -5
  161. data/lib/solargraph/source/chain/if.rb +12 -10
  162. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  163. data/lib/solargraph/source/chain/link.rb +99 -109
  164. data/lib/solargraph/source/chain/literal.rb +9 -6
  165. data/lib/solargraph/source/chain/or.rb +10 -4
  166. data/lib/solargraph/source/chain/q_call.rb +13 -11
  167. data/lib/solargraph/source/chain/variable.rb +15 -13
  168. data/lib/solargraph/source/chain/z_super.rb +28 -30
  169. data/lib/solargraph/source/chain.rb +49 -38
  170. data/lib/solargraph/source/change.rb +12 -5
  171. data/lib/solargraph/source/cursor.rb +23 -17
  172. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  173. data/lib/solargraph/source/source_chainer.rb +56 -32
  174. data/lib/solargraph/source/updater.rb +5 -1
  175. data/lib/solargraph/source.rb +59 -35
  176. data/lib/solargraph/source_map/clip.rb +48 -29
  177. data/lib/solargraph/source_map/data.rb +4 -1
  178. data/lib/solargraph/source_map/mapper.rb +71 -42
  179. data/lib/solargraph/source_map.rb +21 -9
  180. data/lib/solargraph/type_checker/problem.rb +3 -1
  181. data/lib/solargraph/type_checker/rules.rb +81 -8
  182. data/lib/solargraph/type_checker.rb +195 -120
  183. data/lib/solargraph/version.rb +1 -1
  184. data/lib/solargraph/workspace/config.rb +13 -10
  185. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  186. data/lib/solargraph/workspace/require_paths.rb +1 -0
  187. data/lib/solargraph/workspace.rb +149 -30
  188. data/lib/solargraph/yard_map/helpers.rb +8 -3
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  191. data/lib/solargraph/yard_map/mapper.rb +13 -8
  192. data/lib/solargraph/yard_tags.rb +20 -20
  193. data/lib/solargraph/yardoc.rb +33 -23
  194. data/lib/solargraph.rb +29 -8
  195. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  196. data/rbs/fills/tuple/tuple.rbs +28 -0
  197. data/rbs/shims/ast/0/node.rbs +1 -1
  198. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  199. data/solargraph.gemspec +36 -34
  200. metadata +38 -33
  201. data/lib/solargraph/type_checker/checks.rb +0 -124
  202. data/lib/solargraph/type_checker/param_def.rb +0 -37
  203. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -16,15 +16,20 @@ module Solargraph
16
16
  # @return [Array<Pin::LocalVariable>]
17
17
  attr_reader :locals
18
18
 
19
+ # @return [Array<Pin::InstanceVariable>]
20
+ attr_reader :ivars
21
+
19
22
  # @param node [Parser::AST::Node]
20
23
  # @param region [Region]
21
24
  # @param pins [Array<Pin::Base>]
22
25
  # @param locals [Array<Pin::LocalVariable>]
23
- def initialize node, region, pins, locals
26
+ # @param ivars [Array<Pin::InstanceVariable>]
27
+ def initialize node, region, pins, locals, ivars
24
28
  @node = node
25
29
  @region = region
26
30
  @pins = pins
27
31
  @locals = locals
32
+ @ivars = ivars
28
33
  @processed_children = false
29
34
  end
30
35
 
@@ -40,6 +45,28 @@ module Solargraph
40
45
 
41
46
  private
42
47
 
48
+ # @return [Solargraph::Location]
49
+ def location
50
+ get_node_location(node)
51
+ end
52
+
53
+ # @return [Solargraph::Position]
54
+ def position
55
+ Position.new(node.loc.line, node.loc.column)
56
+ end
57
+
58
+ # @sg-ignore downcast output of Enumerable#select
59
+ # @return [Solargraph::Pin::Breakable, nil]
60
+ def enclosing_breakable_pin
61
+ pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
62
+ end
63
+
64
+ # @todo downcast output of Enumerable#select
65
+ # @return [Solargraph::Pin::CompoundStatement, nil]
66
+ def enclosing_compound_statement_pin
67
+ pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
68
+ end
69
+
43
70
  # @param subregion [Region]
44
71
  # @return [void]
45
72
  def process_children subregion = region
@@ -47,20 +74,20 @@ module Solargraph
47
74
  @processed_children = true
48
75
  node.children.each do |child|
49
76
  next unless Parser.is_ast_node?(child)
50
- NodeProcessor.process(child, subregion, pins, locals)
77
+ NodeProcessor.process(child, subregion, pins, locals, ivars)
51
78
  end
52
79
  end
53
80
 
54
81
  # @param node [Parser::AST::Node]
55
82
  # @return [Solargraph::Location]
56
- def get_node_location(node)
83
+ def get_node_location node
57
84
  range = Parser.node_range(node)
58
85
  Location.new(region.filename, range)
59
86
  end
60
87
 
61
88
  # @param node [Parser::AST::Node]
62
89
  # @return [String, nil]
63
- def comments_for(node)
90
+ def comments_for node
64
91
  region.source.comments_for(node)
65
92
  end
66
93
 
@@ -68,6 +95,7 @@ module Solargraph
68
95
  # @return [Pin::Closure, nil]
69
96
  def named_path_pin position
70
97
  pins.select do |pin|
98
+ # @sg-ignore Need to add nil check here
71
99
  pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)
72
100
  end.last
73
101
  end
@@ -77,6 +105,7 @@ module Solargraph
77
105
  # @return [Pin::Closure, nil]
78
106
  def block_pin position
79
107
  # @todo determine if this can return a Pin::Block
108
+ # @sg-ignore Need to add nil check here
80
109
  pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
81
110
  end
82
111
 
@@ -84,6 +113,7 @@ module Solargraph
84
113
  # @param position [Solargraph::Position]
85
114
  # @return [Pin::Closure, nil]
86
115
  def closure_pin position
116
+ # @sg-ignore Need to add nil check here
87
117
  pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
88
118
  end
89
119
  end
@@ -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
@@ -30,35 +34,43 @@ module Solargraph
30
34
  # @return [::Parser::Base]
31
35
  def parser
32
36
  @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
37
+ # @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
33
38
  parser.diagnostics.all_errors_are_fatal = true
39
+ # @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
34
40
  parser.diagnostics.ignore_warnings = true
35
41
  end
36
42
  end
37
43
 
38
44
  # @param source [Source]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
45
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
40
46
  def map source
41
- NodeProcessor.process(source.node, Region.new(source: source))
47
+ # @sg-ignore Need to add nil check here
48
+ pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
49
+ pins.concat(ivars)
50
+ [pins, locals]
42
51
  end
43
52
 
44
53
  # @param source [Source]
45
54
  # @param name [String]
46
55
  # @return [Array<Location>]
47
56
  def references source, name
48
- if name.end_with?("=")
57
+ if name.end_with?('=')
49
58
  reg = /#{Regexp.escape name[0..-2]}\s*=/
50
59
  # @param code [String]
51
60
  # @param offset [Integer]
52
61
  # @return [Array(Integer, Integer), Array(nil, nil)]
62
+ # @sg-ignore Need to add nil check here
53
63
  extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
54
64
  else
55
65
  # @param code [String]
56
66
  # @param offset [Integer]
57
67
  # @return [Array(Integer, Integer), Array(nil, nil)]
68
+ # @sg-ignore Need to add nil check here
58
69
  extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
59
70
  end
60
71
  inner_node_references(name, source.node).map do |n|
61
72
  rng = Range.from_node(n)
73
+ # @sg-ignore Need to add nil check here
62
74
  offset = Position.to_offset(source.code, rng.start)
63
75
  soff, eoff = extract_offset[source.code, offset]
64
76
  Location.new(
@@ -86,20 +98,20 @@ module Solargraph
86
98
 
87
99
  # @return [Source::Chain]
88
100
  def chain *args
89
- NodeChainer.chain *args
101
+ NodeChainer.chain(*args)
90
102
  end
91
103
 
92
104
  # @return [Source::Chain]
93
105
  def chain_string *args
94
- NodeChainer.load_string *args
106
+ NodeChainer.load_string(*args)
95
107
  end
96
108
 
97
109
  # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
98
110
  def process_node *args
99
- Solargraph::Parser::NodeProcessor.process *args
111
+ Solargraph::Parser::NodeProcessor.process(*args)
100
112
  end
101
113
 
102
- # @param node [Parser::AST::Node]
114
+ # @param node [Parser::AST::Node, nil]
103
115
  # @return [String, nil]
104
116
  def infer_literal_node_type node
105
117
  NodeMethods.infer_literal_node_type node
@@ -110,7 +122,7 @@ module Solargraph
110
122
  parser.version
111
123
  end
112
124
 
113
- # @param node [BasicObject]
125
+ # @param node [BasicObject, nil]
114
126
  # @return [Boolean]
115
127
  def is_ast_node? node
116
128
  node.is_a?(::Parser::AST::Node)
@@ -124,19 +136,25 @@ module Solargraph
124
136
  Range.new(st, en)
125
137
  end
126
138
 
127
- # @param node [Parser::AST::Node]
139
+ # @param node [Parser::AST::Node, nil]
128
140
  # @return [Array<Range>]
129
141
  def string_ranges node
130
142
  return [] unless is_ast_node?(node)
131
143
  result = []
144
+ # @sg-ignore Translate to something flow sensitive typing understands
132
145
  result.push Range.from_node(node) if node.type == :str
146
+ # @sg-ignore Translate to something flow sensitive typing understands
133
147
  node.children.each do |child|
134
148
  result.concat string_ranges(child)
135
149
  end
150
+ # @sg-ignore Translate to something flow sensitive typing understands
136
151
  if node.type == :dstr && node.children.last.nil?
152
+ # @sg-ignore Translate to something flow sensitive typing understands
137
153
  last = node.children[-2]
154
+ # @sg-ignore Need to add nil check here
138
155
  unless last.nil?
139
156
  rng = Range.from_node(last)
157
+ # @sg-ignore Need to add nil check here
140
158
  pos = Position.new(rng.ending.line, rng.ending.column - 1)
141
159
  result.push Range.new(pos, pos)
142
160
  end
@@ -1,19 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- # A custom builder for source parsers that ignores character encoding
7
- # issues in literal strings.
8
- #
9
- class FlawedBuilder < ::Parser::Builders::Default
10
- # @param token [::Parser::AST::Node]
11
- # @return [String]
12
- # @sg-ignore
13
- def string_value(token)
14
- value(token)
15
- end
16
- end
17
- end
18
- end
19
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ # A custom builder for source parsers that ignores character encoding
7
+ # issues in literal strings.
8
+ #
9
+ class FlawedBuilder < ::Parser::Builders::Default
10
+ # @param token [::Parser::AST::Node]
11
+ # @return [String]
12
+ # @sg-ignore
13
+ def string_value token
14
+ value(token)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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,7 @@ 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)
136
156
  end
137
157
  result
138
158
  end
@@ -141,7 +161,9 @@ module Solargraph
141
161
  def hash_is_splatted? node
142
162
  return false unless Parser.is_ast_node?(node) && node.type == :hash
143
163
  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
164
+ if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
165
+ return false
166
+ end
145
167
  true
146
168
  end
147
169
 
@@ -150,13 +172,16 @@ module Solargraph
150
172
  def passed_block node
151
173
  return unless node == @node && @parent&.type == :block
152
174
 
175
+ # @sg-ignore Need to add nil check here
153
176
  NodeChainer.chain(@parent.children[2], @filename)
154
177
  end
155
178
 
156
179
  # @param node [Parser::AST::Node]
180
+ # @sg-ignore Need to add nil check here
157
181
  # @return [Array<Source::Chain>]
158
182
  def node_args node
159
- node.children[2..-1].map do |child|
183
+ # @sg-ignore Need to add nil check here
184
+ node.children[2..].map do |child|
160
185
  NodeChainer.chain(child, @filename, node)
161
186
  end
162
187
  end