solargraph 0.59.0.dev.1 → 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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +4 -1
  3. data/.github/workflows/rspec.yml +3 -14
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +32 -5
  6. data/.rubocop_todo.yml +37 -931
  7. data/CHANGELOG.md +7 -1
  8. data/Gemfile +3 -1
  9. data/Rakefile +25 -23
  10. data/bin/solargraph +2 -1
  11. data/lib/solargraph/api_map/index.rb +5 -11
  12. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  13. data/lib/solargraph/api_map/store.rb +22 -20
  14. data/lib/solargraph/api_map.rb +50 -37
  15. data/lib/solargraph/bench.rb +44 -45
  16. data/lib/solargraph/complex_type/type_methods.rb +12 -15
  17. data/lib/solargraph/complex_type/unique_type.rb +54 -43
  18. data/lib/solargraph/complex_type.rb +69 -61
  19. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  21. data/lib/solargraph/convention/data_definition.rb +1 -1
  22. data/lib/solargraph/convention/gemfile.rb +15 -15
  23. data/lib/solargraph/convention/gemspec.rb +23 -23
  24. data/lib/solargraph/convention/rakefile.rb +17 -17
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  27. data/lib/solargraph/convention/struct_definition.rb +3 -3
  28. data/lib/solargraph/convention.rb +78 -78
  29. data/lib/solargraph/converters/dd.rb +19 -17
  30. data/lib/solargraph/converters/dl.rb +17 -15
  31. data/lib/solargraph/converters/dt.rb +17 -15
  32. data/lib/solargraph/converters/misc.rb +3 -1
  33. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  34. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  35. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  36. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  37. data/lib/solargraph/doc_map.rb +9 -10
  38. data/lib/solargraph/equality.rb +3 -3
  39. data/lib/solargraph/gem_pins.rb +7 -5
  40. data/lib/solargraph/language_server/error_codes.rb +20 -20
  41. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  43. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  44. data/lib/solargraph/language_server/host/sources.rb +1 -1
  45. data/lib/solargraph/language_server/host.rb +24 -21
  46. data/lib/solargraph/language_server/message/base.rb +97 -97
  47. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  48. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  49. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  50. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  51. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  52. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  53. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  56. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  58. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  59. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  60. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  61. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  62. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  63. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  64. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  65. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  66. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  67. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  68. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  69. data/lib/solargraph/language_server/message.rb +94 -94
  70. data/lib/solargraph/language_server/request.rb +29 -27
  71. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  72. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  73. data/lib/solargraph/library.rb +28 -33
  74. data/lib/solargraph/location.rb +10 -12
  75. data/lib/solargraph/logging.rb +4 -4
  76. data/lib/solargraph/page.rb +92 -92
  77. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  78. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
  79. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  80. data/lib/solargraph/parser/node_processor.rb +1 -1
  81. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
  82. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  83. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  84. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  85. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  91. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  93. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  94. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  95. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  96. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  97. data/lib/solargraph/parser/parser_gem.rb +14 -12
  98. data/lib/solargraph/parser/snippet.rb +2 -0
  99. data/lib/solargraph/parser.rb +25 -23
  100. data/lib/solargraph/pin/base.rb +78 -64
  101. data/lib/solargraph/pin/base_variable.rb +28 -71
  102. data/lib/solargraph/pin/block.rb +3 -2
  103. data/lib/solargraph/pin/breakable.rb +2 -0
  104. data/lib/solargraph/pin/callable.rb +23 -26
  105. data/lib/solargraph/pin/closure.rb +5 -4
  106. data/lib/solargraph/pin/common.rb +5 -2
  107. data/lib/solargraph/pin/compound_statement.rb +3 -3
  108. data/lib/solargraph/pin/constant.rb +43 -45
  109. data/lib/solargraph/pin/conversions.rb +9 -4
  110. data/lib/solargraph/pin/delegated_method.rb +4 -4
  111. data/lib/solargraph/pin/documenting.rb +3 -2
  112. data/lib/solargraph/pin/local_variable.rb +4 -4
  113. data/lib/solargraph/pin/method.rb +71 -70
  114. data/lib/solargraph/pin/namespace.rb +13 -12
  115. data/lib/solargraph/pin/parameter.rb +28 -27
  116. data/lib/solargraph/pin/proxy_type.rb +2 -0
  117. data/lib/solargraph/pin/reference.rb +17 -0
  118. data/lib/solargraph/pin/search.rb +2 -2
  119. data/lib/solargraph/pin/signature.rb +9 -14
  120. data/lib/solargraph/pin/symbol.rb +1 -0
  121. data/lib/solargraph/pin/until.rb +1 -3
  122. data/lib/solargraph/pin/while.rb +1 -3
  123. data/lib/solargraph/pin_cache.rb +16 -19
  124. data/lib/solargraph/position.rb +35 -17
  125. data/lib/solargraph/range.rb +10 -9
  126. data/lib/solargraph/rbs_map/conversions.rb +312 -206
  127. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  128. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  129. data/lib/solargraph/rbs_map.rb +3 -12
  130. data/lib/solargraph/server_methods.rb +16 -16
  131. data/lib/solargraph/shell.rb +63 -53
  132. data/lib/solargraph/source/chain/array.rb +39 -37
  133. data/lib/solargraph/source/chain/call.rb +49 -44
  134. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  135. data/lib/solargraph/source/chain/constant.rb +3 -1
  136. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  137. data/lib/solargraph/source/chain/hash.rb +8 -6
  138. data/lib/solargraph/source/chain/if.rb +11 -10
  139. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  140. data/lib/solargraph/source/chain/link.rb +99 -109
  141. data/lib/solargraph/source/chain/literal.rb +4 -6
  142. data/lib/solargraph/source/chain/or.rb +2 -4
  143. data/lib/solargraph/source/chain/q_call.rb +13 -11
  144. data/lib/solargraph/source/chain/variable.rb +15 -13
  145. data/lib/solargraph/source/chain/z_super.rb +28 -30
  146. data/lib/solargraph/source/chain.rb +24 -16
  147. data/lib/solargraph/source/change.rb +3 -3
  148. data/lib/solargraph/source/cursor.rb +18 -18
  149. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  150. data/lib/solargraph/source/source_chainer.rb +46 -32
  151. data/lib/solargraph/source/updater.rb +1 -1
  152. data/lib/solargraph/source.rb +27 -29
  153. data/lib/solargraph/source_map/clip.rb +38 -30
  154. data/lib/solargraph/source_map/mapper.rb +52 -46
  155. data/lib/solargraph/source_map.rb +8 -4
  156. data/lib/solargraph/type_checker/rules.rb +8 -8
  157. data/lib/solargraph/type_checker.rb +95 -101
  158. data/lib/solargraph/version.rb +1 -1
  159. data/lib/solargraph/workspace/config.rb +10 -9
  160. data/lib/solargraph/workspace/gemspecs.rb +1 -1
  161. data/lib/solargraph/workspace.rb +21 -44
  162. data/lib/solargraph/yard_map/helpers.rb +6 -2
  163. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  164. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  165. data/lib/solargraph/yard_map/mapper.rb +12 -12
  166. data/lib/solargraph/yard_tags.rb +20 -20
  167. data/lib/solargraph.rb +5 -5
  168. data/solargraph.gemspec +35 -34
  169. metadata +28 -28
@@ -13,7 +13,9 @@ module Solargraph
13
13
  @cursor = cursor
14
14
  closure_pin = closure
15
15
  # @sg-ignore Need to add nil check here
16
- closure_pin.rebind(api_map) if closure_pin.is_a?(Pin::Block) && !Solargraph::Range.from_node(closure_pin.receiver).contain?(cursor.range.start)
16
+ if closure_pin.is_a?(Pin::Block) && !Solargraph::Range.from_node(closure_pin.receiver).contain?(cursor.range.start)
17
+ closure_pin.rebind(api_map)
18
+ end
17
19
  end
18
20
 
19
21
  # @return [Array<Pin::Base>] Relevant pins for infering the type of the Cursor's position
@@ -21,8 +23,12 @@ module Solargraph
21
23
  return [] if cursor.comment? || cursor.chain.literal?
22
24
  result = cursor.chain.define(api_map, closure, locals)
23
25
  result.concat file_global_methods
24
- # @sg-ignore Need to add nil check here
25
- result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
26
+ if result.empty?
27
+ result.concat((source_map.pins + source_map.locals).select do |p|
28
+ # @sg-ignore Need to add nil check here
29
+ p.name == cursor.word && p.location.range.contain?(cursor.position)
30
+ end)
31
+ end
26
32
  result
27
33
  end
28
34
 
@@ -34,7 +40,9 @@ module Solargraph
34
40
  # @return [Completion]
35
41
  def complete
36
42
  return package_completions([]) if !source_map.source.parsed? || cursor.string?
37
- return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
43
+ if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
44
+ return package_completions(api_map.get_symbols)
45
+ end
38
46
  return Completion.new([], cursor.range) if cursor.chain.literal?
39
47
  if cursor.comment?
40
48
  tag_complete
@@ -128,12 +136,11 @@ module Solargraph
128
136
  next unless param.keyword?
129
137
  result.push Pin::KeywordParam.new(pin.location, "#{param.name}:")
130
138
  end
131
- if !pin.parameters.empty? && pin.parameters.last.kwrestarg?
132
- pin.docstring.tags(:param).each do |tag|
133
- next if done.include?(tag.name)
134
- done.push tag.name
135
- result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
136
- end
139
+ next unless !pin.parameters.empty? && pin.parameters.last.kwrestarg?
140
+ pin.docstring.tags(:param).each do |tag|
141
+ next if done.include?(tag.name)
142
+ done.push tag.name
143
+ result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
137
144
  end
138
145
  end
139
146
  result
@@ -143,10 +150,10 @@ module Solargraph
143
150
  # @return [Completion]
144
151
  def package_completions result
145
152
  frag_start = cursor.start_of_word.to_s.downcase
146
- filtered = result.uniq(&:name).select { |s|
153
+ filtered = result.uniq(&:name).select do |s|
147
154
  s.name.downcase.start_with?(frag_start) &&
148
- (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(\!|\?|=)?$/i))
149
- }
155
+ (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(!|\?|=)?$/i))
156
+ end
150
157
  Completion.new(filtered, cursor.range)
151
158
  end
152
159
 
@@ -154,7 +161,7 @@ module Solargraph
154
161
  def tag_complete
155
162
  result = []
156
163
  # @sg-ignore Need to add nil check here
157
- match = source_map.code[0..cursor.offset-1].match(/[\[<, ]([a-z0-9_:]*)\z/i)
164
+ match = source_map.code[0..(cursor.offset - 1)].match(/[\[<, ]([a-z0-9_:]*)\z/i)
158
165
  if match
159
166
  # @sg-ignore Need to add nil check here
160
167
  full = match[1]
@@ -170,7 +177,7 @@ module Solargraph
170
177
  end
171
178
  else
172
179
  # @sg-ignore Need to add nil check here
173
- result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
180
+ result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) # .select { |pin| pin.name.start_with?(full) }
174
181
  end
175
182
  end
176
183
  package_completions(result)
@@ -183,25 +190,24 @@ module Solargraph
183
190
  if cursor.chain.constant? || cursor.start_of_constant?
184
191
  full = cursor.chain.links.first.word
185
192
  type = if cursor.chain.undefined?
186
- cursor.chain.base.infer(api_map, context_pin, locals)
187
- else
188
- if full.include?('::') && cursor.chain.links.length == 1
189
- # @sg-ignore Need to add nil check here
190
- ComplexType.try_parse(full.split('::')[0..-2].join('::'))
191
- elsif cursor.chain.links.length > 1
192
- ComplexType.try_parse(full)
193
- else
194
- ComplexType::UNDEFINED
195
- end
196
- end
193
+ cursor.chain.base.infer(api_map, context_pin, locals)
194
+ elsif full.include?('::') && cursor.chain.links.length == 1
195
+ # @sg-ignore Need to add nil check here
196
+ ComplexType.try_parse(full.split('::')[0..-2].join('::'))
197
+ elsif cursor.chain.links.length > 1
198
+ ComplexType.try_parse(full)
199
+ else
200
+ ComplexType::UNDEFINED
201
+ end
197
202
  if type.undefined?
198
203
  if full.include?('::')
199
204
  result.concat api_map.get_constants(full, *gates)
200
205
  else
201
- result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
206
+ result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) # .select { |pin| pin.name.start_with?(full) }
202
207
  end
203
208
  else
204
- result.concat api_map.get_constants(type.namespace, cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
209
+ result.concat api_map.get_constants(type.namespace,
210
+ cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
205
211
  end
206
212
  else
207
213
  type = cursor.chain.base.infer(api_map, closure, locals)
@@ -210,14 +216,16 @@ module Solargraph
210
216
  if cursor.word.start_with?('@@')
211
217
  return package_completions(api_map.get_class_variable_pins(context_pin.full_context.namespace))
212
218
  elsif cursor.word.start_with?('@')
213
- return package_completions(api_map.get_instance_variable_pins(closure.full_context.namespace, closure.context.scope))
219
+ return package_completions(api_map.get_instance_variable_pins(closure.full_context.namespace,
220
+ closure.context.scope))
214
221
  elsif cursor.word.start_with?('$')
215
222
  return package_completions(api_map.get_global_variable_pins)
216
223
  end
217
224
  result.concat locals
218
225
  result.concat file_global_methods unless closure.binder.namespace.empty?
219
226
  result.concat api_map.get_constants(context_pin.context.namespace, *gates)
220
- result.concat api_map.get_methods(closure.binder.namespace, scope: closure.binder.scope, visibility: [:public, :private, :protected])
227
+ result.concat api_map.get_methods(closure.binder.namespace, scope: closure.binder.scope,
228
+ visibility: %i[public private protected])
221
229
  result.concat api_map.get_methods('Kernel')
222
230
  result.concat api_map.keyword_pins.to_a
223
231
  end
@@ -12,7 +12,7 @@ module Solargraph
12
12
 
13
13
  private_class_method :new
14
14
 
15
- DIRECTIVE_REGEXP = /(@\!method|@\!attribute|@\!visibility|@\!domain|@\!macro|@\!parse|@\!override)/.freeze
15
+ DIRECTIVE_REGEXP = /(@!method|@!attribute|@!visibility|@!domain|@!macro|@!parse|@!override)/
16
16
 
17
17
  # Generate the data.
18
18
  #
@@ -29,10 +29,10 @@ module Solargraph
29
29
  @locals.each { |l| l.source = :code }
30
30
  process_comment_directives
31
31
  [@pins, @locals]
32
- # rescue Exception => e
33
- # Solargraph.logger.warn "Error mapping #{source.filename}: [#{e.class}] #{e.message}"
34
- # Solargraph.logger.warn e.backtrace.join("\n")
35
- # [[], []]
32
+ # rescue Exception => e
33
+ # Solargraph.logger.warn "Error mapping #{source.filename}: [#{e.class}] #{e.message}"
34
+ # Solargraph.logger.warn e.backtrace.join("\n")
35
+ # [[], []]
36
36
  end
37
37
 
38
38
  # @param filename [String]
@@ -63,9 +63,9 @@ module Solargraph
63
63
 
64
64
  # @param position [Solargraph::Position]
65
65
  # @return [Solargraph::Pin::Closure]
66
- def closure_at(position)
66
+ def closure_at position
67
67
  # @sg-ignore Need to add nil check here
68
- pins.select{|pin| pin.is_a?(Pin::Closure) and pin.location.range.contain?(position)}.last
68
+ pins.select { |pin| pin.is_a?(Pin::Closure) and pin.location.range.contain?(position) }.last
69
69
  end
70
70
 
71
71
  # @param source_position [Position]
@@ -94,7 +94,7 @@ module Solargraph
94
94
  # Avoid overruning the index
95
95
  return start unless start < comment.lines.length
96
96
  # @sg-ignore Need to add nil check here
97
- num = comment.lines[start..-1].find_index do |line|
97
+ num = comment.lines[start..].find_index do |line|
98
98
  # Legacy method directives might be `@method` instead of `@!method`
99
99
  # @todo Legacy syntax should probably emit a warning
100
100
  line.include?("@!#{tag}") || (tag == 'method' && line.include?("@#{tag}"))
@@ -114,11 +114,8 @@ module Solargraph
114
114
  case directive.tag.tag_name
115
115
  when 'method'
116
116
  namespace = closure_at(source_position) || @pins.first
117
- # @todo Missed nil violation
118
- # @todo Need to add nil check here
119
- if namespace.location.range.start.line < comment_position.line
120
- namespace = closure_at(comment_position)
121
- end
117
+ # @sg-ignore Need to add nil check here
118
+ namespace = closure_at(comment_position) if namespace.location.range.start.line < comment_position.line
122
119
  begin
123
120
  src = Solargraph::Source.load_string("def #{directive.tag.name};end", @source.filename)
124
121
  region = Parser::Region.new(source: src, closure: namespace)
@@ -128,19 +125,20 @@ module Solargraph
128
125
  return if gen_pin.nil?
129
126
  # Move the location to the end of the line so it gets recognized
130
127
  # as originating from a comment
131
- shifted = Solargraph::Position.new(comment_position.line, @code.lines[comment_position.line].to_s.chomp.length)
128
+ shifted = Solargraph::Position.new(comment_position.line,
129
+ @code.lines[comment_position.line].to_s.chomp.length)
132
130
  # @todo: Smelly instance variable access
133
131
  gen_pin.instance_variable_set(:@comments, docstring.all.to_s)
134
132
  gen_pin.instance_variable_set(:@location, Solargraph::Location.new(@filename, Range.new(shifted, shifted)))
135
133
  gen_pin.instance_variable_set(:@explicit, false)
136
134
  @pins.push gen_pin
137
- rescue Parser::SyntaxError => e
135
+ rescue Parser::SyntaxError
138
136
  # @todo Handle error in directive
139
137
  end
140
138
  when 'attribute'
141
139
  return if directive.tag.name.nil?
142
140
  namespace = closure_at(source_position)
143
- t = (directive.tag.types.nil? || directive.tag.types.empty?) ? nil : directive.tag.types.flatten.join('')
141
+ t = directive.tag.types.nil? || directive.tag.types.empty? ? nil : directive.tag.types.join
144
142
  if t.nil? || t.include?('r')
145
143
  pins.push Solargraph::Pin::Method.new(
146
144
  location: location,
@@ -166,34 +164,35 @@ module Solargraph
166
164
  source: :source_map
167
165
  )
168
166
  pins.push method_pin
169
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :source_map)
167
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last,
168
+ source: :source_map)
170
169
  if pins.last.return_type.defined?
171
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
170
+ pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '),
171
+ 'value')
172
172
  end
173
173
  end
174
174
  when 'visibility'
175
175
 
176
- kind = directive.tag.text&.to_sym
177
- # @sg-ignore Need to look at Tuple#include? handling
178
- return unless [:private, :protected, :public].include?(kind)
176
+ kind = directive.tag.text&.to_sym
177
+ # @sg-ignore Need to look at Tuple#include? handling
178
+ return unless %i[private protected public].include?(kind)
179
179
 
180
- name = directive.tag.name
181
- closure = closure_at(source_position) || @pins.first
182
- # @todo Missed nil violation
183
- # @todo Need to add nil check here
184
- if closure.location.range.start.line < comment_position.line
185
- closure = closure_at(comment_position)
180
+ name = directive.tag.name
181
+ closure = closure_at(source_position) || @pins.first
182
+ # @sg-ignore Need to add nil check here
183
+ closure = closure_at(comment_position) if closure.location.range.start.line < comment_position.line
184
+ if closure.is_a?(Pin::Method) && no_empty_lines?(comment_position.line, source_position.line)
185
+ # @todo Smelly instance variable access
186
+ closure.instance_variable_set(:@visibility, kind)
187
+ else
188
+ matches = pins.select do |pin|
189
+ pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == namespace && pin.context.scope == namespace.is_a?(Pin::Singleton) ? :class : :instance
186
190
  end
187
- if closure.is_a?(Pin::Method) && no_empty_lines?(comment_position.line, source_position.line)
191
+ matches.each do |pin|
188
192
  # @todo Smelly instance variable access
189
- closure.instance_variable_set(:@visibility, kind)
190
- else
191
- matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == namespace && pin.context.scope == namespace.is_a?(Pin::Singleton) ? :class : :instance }
192
- matches.each do |pin|
193
- # @todo Smelly instance variable access
194
- pin.instance_variable_set(:@visibility, kind)
195
- end
193
+ pin.instance_variable_set(:@visibility, kind)
196
194
  end
195
+ end
197
196
 
198
197
  when 'parse'
199
198
  begin
@@ -204,21 +203,21 @@ module Solargraph
204
203
  # @todo These pins may need to be marked not explicit
205
204
  index = @pins.length
206
205
  loff = if @code.lines[comment_position.line].strip.end_with?('@!parse')
207
- comment_position.line + 1
208
- else
209
- comment_position.line
210
- end
206
+ comment_position.line + 1
207
+ else
208
+ comment_position.line
209
+ end
211
210
  locals = []
212
211
  ivars = []
213
212
  Parser.process_node(src.node, region, @pins, locals, ivars)
214
213
  @pins.concat ivars
215
214
  # @sg-ignore Need to add nil check here
216
- @pins[index..-1].each do |p|
215
+ @pins[index..].each do |p|
217
216
  # @todo Smelly instance variable access
218
217
  p.location.range.start.instance_variable_set(:@line, p.location.range.start.line + loff)
219
218
  p.location.range.ending.instance_variable_set(:@line, p.location.range.ending.line + loff)
220
219
  end
221
- rescue Parser::SyntaxError => e
220
+ rescue Parser::SyntaxError
222
221
  # @todo Handle parser errors in !parse directives
223
222
  end
224
223
  when 'domain'
@@ -237,7 +236,7 @@ module Solargraph
237
236
  # @param line1 [Integer]
238
237
  # @param line2 [Integer]
239
238
  # @sg-ignore Need to add nil check here
240
- def no_empty_lines?(line1, line2)
239
+ def no_empty_lines? line1, line2
241
240
  # @sg-ignore Need to add nil check here
242
241
  @code.lines[line1..line2].none? { |line| line.strip.empty? }
243
242
  end
@@ -248,7 +247,7 @@ module Solargraph
248
247
  ctxt = ''
249
248
  num = nil
250
249
  started = false
251
- comment.lines.each { |l|
250
+ comment.lines.each do |l|
252
251
  # Trim the comment and minimum leading whitespace
253
252
  p = l.encode('UTF-8', invalid: :replace, replace: '?').gsub(/^#+/, '')
254
253
  if num.nil? && !p.strip.empty?
@@ -259,8 +258,8 @@ module Solargraph
259
258
  # @sg-ignore Need to add nil check here
260
259
  num = cur if cur < num
261
260
  end
262
- ctxt += "#{p[num..-1]}" if started
263
- }
261
+ ctxt += p[num..].to_s if started
262
+ end
264
263
  ctxt
265
264
  end
266
265
 
@@ -269,7 +268,14 @@ module Solargraph
269
268
  return unless @code.encode('UTF-8', invalid: :replace, replace: '?') =~ DIRECTIVE_REGEXP
270
269
  code_lines = @code.lines
271
270
  @source.associated_comments.each do |line, comments|
272
- src_pos = line ? Position.new(line, code_lines[line].to_s.chomp.index(/[^\s]/) || 0) : Position.new(code_lines.length, 0)
271
+ src_pos = if line
272
+ Position.new(line,
273
+ code_lines[line].to_s.chomp.index(/[^\s]/) || 0)
274
+ else
275
+ Position.new(
276
+ code_lines.length, 0
277
+ )
278
+ end
273
279
  # @sg-ignore Need to add nil check here
274
280
  com_pos = Position.new(line + 1 - comments.lines.length, 0)
275
281
  process_comment(src_pos, com_pos, comments)
@@ -62,7 +62,9 @@ module Solargraph
62
62
  #
63
63
  # @return [Integer]
64
64
  def api_hash
65
- @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
65
+ @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select do |pin|
66
+ pin.namespace.to_s > ''
67
+ end + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
66
68
  end
67
69
 
68
70
  # @return [String, nil]
@@ -144,7 +146,7 @@ module Solargraph
144
146
 
145
147
  # @param location [Location]
146
148
  # @return [Array<Pin::LocalVariable>]
147
- def locals_at(location)
149
+ def locals_at location
148
150
  return [] if location.filename != filename
149
151
  closure = locate_closure_pin(location.range.start.line, location.range.start.character)
150
152
  locals.select { |pin| pin.visible_at?(closure, location) }
@@ -208,8 +210,10 @@ module Solargraph
208
210
  # @todo Attribute pins should not be treated like closures, but
209
211
  # there's probably a better way to handle it
210
212
  next if pin.is_a?(Pin::Method) && pin.attribute?
211
- # @sg-ignore Need to add nil check here
212
- found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
213
+ found = pin if (klasses.empty? || klasses.any? do |kls|
214
+ pin.is_a?(kls)
215
+ # @sg-ignore Need to add nil check here
216
+ end) && pin.location.range.contain?(position)
213
217
  # @sg-ignore Need to add nil check here
214
218
  break if pin.location.range.start.line > line
215
219
  end
@@ -23,11 +23,11 @@ module Solargraph
23
23
  # @param overrides [Hash{Symbol => Symbol}]
24
24
  def initialize level, overrides
25
25
  @rank = if LEVELS.key?(level)
26
- LEVELS[level]
27
- else
28
- Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
29
- 0
30
- end
26
+ LEVELS[level]
27
+ else
28
+ Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
29
+ 0
30
+ end
31
31
  @level = LEVELS[LEVELS.values.index(@rank)]
32
32
  @overrides = overrides
33
33
  end
@@ -83,11 +83,12 @@ module Solargraph
83
83
  # @todo 13: Need to validate config
84
84
  # @todo 8: flow sensitive typing should support .class == .class
85
85
  # @todo 6: need boolish support for ? methods
86
+ # @todo 6: flow sensitive typing needs better handling of ||= on lvars
86
87
  # @todo 5: literal arrays in this module turn into ::Solargraph::Source::Chain::Array
87
88
  # @todo 5: flow sensitive typing needs to handle 'raise if'
88
- # @todo 5: flow sensitive typing needs better handling of ||= on lvars
89
89
  # @todo 4: flow sensitive typing needs to eliminate literal from union with [:bar].include?(foo)
90
90
  # @todo 4: nil? support in flow sensitive typing
91
+ # @todo 3: flow sensitive typing ought to be able to handle 'when ClassName'
91
92
  # @todo 2: downcast output of Enumerable#select
92
93
  # @todo 2: flow sensitive typing should handle return nil if location&.name.nil?
93
94
  # @todo 2: flow sensitive typing should handle is_a? and next
@@ -98,7 +99,6 @@ module Solargraph
98
99
  # @todo 2: Need to handle duck-typed method calls on union types
99
100
  # @todo 2: Need better handling of #compact
100
101
  # @todo 2: flow sensitive typing should allow shadowing of Kernel#caller
101
- # @todo 2: flow sensitive typing ought to be able to handle 'when ClassName'
102
102
  # @todo 1: flow sensitive typing not smart enough to handle this case
103
103
  # @todo 1: flow sensitive typing needs to handle if foo = bar
104
104
  # @todo 1: flow sensitive typing needs to handle "if foo.nil?"
@@ -149,7 +149,7 @@ module Solargraph
149
149
 
150
150
  # @param type [Symbol]
151
151
  # @param level [Symbol]
152
- def report?(type, level)
152
+ def report? type, level
153
153
  rank >= LEVELS[@overrides.fetch(type, level)]
154
154
  end
155
155
  end