solargraph 0.33.2 → 0.34.0

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/README.md +1 -1
  4. data/lib/solargraph.rb +5 -0
  5. data/lib/solargraph/api_map.rb +36 -18
  6. data/lib/solargraph/api_map/cache.rb +2 -0
  7. data/lib/solargraph/api_map/source_to_yard.rb +14 -5
  8. data/lib/solargraph/api_map/store.rb +17 -19
  9. data/lib/solargraph/bundle.rb +2 -0
  10. data/lib/solargraph/complex_type.rb +18 -4
  11. data/lib/solargraph/complex_type/type_methods.rb +2 -0
  12. data/lib/solargraph/complex_type/unique_type.rb +2 -0
  13. data/lib/solargraph/convention.rb +38 -0
  14. data/lib/solargraph/convention/base.rb +28 -0
  15. data/lib/solargraph/convention/gemfile.rb +18 -0
  16. data/lib/solargraph/convention/gemspec.rb +25 -0
  17. data/lib/solargraph/convention/rspec.rb +23 -0
  18. data/lib/solargraph/core_fills.rb +66 -42
  19. data/lib/solargraph/diagnostics.rb +2 -0
  20. data/lib/solargraph/diagnostics/base.rb +2 -0
  21. data/lib/solargraph/diagnostics/require_not_found.rb +2 -0
  22. data/lib/solargraph/diagnostics/rubocop.rb +2 -0
  23. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  24. data/lib/solargraph/diagnostics/severities.rb +15 -13
  25. data/lib/solargraph/diagnostics/type_check.rb +2 -0
  26. data/lib/solargraph/diagnostics/update_errors.rb +2 -0
  27. data/lib/solargraph/documentor.rb +42 -0
  28. data/lib/solargraph/environ.rb +40 -0
  29. data/lib/solargraph/language_server.rb +19 -17
  30. data/lib/solargraph/language_server/completion_item_kinds.rb +2 -0
  31. data/lib/solargraph/language_server/error_codes.rb +2 -0
  32. data/lib/solargraph/language_server/host.rb +3 -1
  33. data/lib/solargraph/language_server/host/cataloger.rb +2 -0
  34. data/lib/solargraph/language_server/host/diagnoser.rb +2 -0
  35. data/lib/solargraph/language_server/host/dispatch.rb +2 -0
  36. data/lib/solargraph/language_server/host/sources.rb +2 -0
  37. data/lib/solargraph/language_server/message.rb +2 -0
  38. data/lib/solargraph/language_server/message/base.rb +2 -0
  39. data/lib/solargraph/language_server/message/cancel_request.rb +13 -11
  40. data/lib/solargraph/language_server/message/client.rb +11 -9
  41. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -13
  42. data/lib/solargraph/language_server/message/completion_item.rb +11 -9
  43. data/lib/solargraph/language_server/message/completion_item/resolve.rb +2 -0
  44. data/lib/solargraph/language_server/message/exit_notification.rb +2 -0
  45. data/lib/solargraph/language_server/message/extended.rb +2 -0
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
  47. data/lib/solargraph/language_server/message/extended/document.rb +2 -0
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +2 -0
  49. data/lib/solargraph/language_server/message/extended/download_core.rb +27 -25
  50. data/lib/solargraph/language_server/message/extended/environment.rb +5 -0
  51. data/lib/solargraph/language_server/message/extended/search.rb +2 -0
  52. data/lib/solargraph/language_server/message/initialize.rb +2 -0
  53. data/lib/solargraph/language_server/message/initialized.rb +2 -0
  54. data/lib/solargraph/language_server/message/method_not_found.rb +16 -14
  55. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -12
  56. data/lib/solargraph/language_server/message/shutdown.rb +2 -0
  57. data/lib/solargraph/language_server/message/text_document.rb +2 -0
  58. data/lib/solargraph/language_server/message/text_document/base.rb +19 -17
  59. data/lib/solargraph/language_server/message/text_document/code_action.rb +2 -0
  60. data/lib/solargraph/language_server/message/text_document/completion.rb +3 -1
  61. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  62. data/lib/solargraph/language_server/message/text_document/did_change.rb +2 -0
  63. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -13
  64. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -13
  65. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -15
  66. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
  67. data/lib/solargraph/language_server/message/text_document/folding_range.rb +2 -0
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -1
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
  70. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +2 -0
  71. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +2 -0
  72. data/lib/solargraph/language_server/message/text_document/references.rb +2 -0
  73. data/lib/solargraph/language_server/message/text_document/rename.rb +2 -0
  74. data/lib/solargraph/language_server/message/text_document/signature_help.rb +7 -1
  75. data/lib/solargraph/language_server/message/workspace.rb +2 -0
  76. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +2 -0
  77. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +2 -0
  78. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  79. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
  80. data/lib/solargraph/language_server/message_types.rb +14 -12
  81. data/lib/solargraph/language_server/request.rb +2 -0
  82. data/lib/solargraph/language_server/symbol_kinds.rb +2 -0
  83. data/lib/solargraph/language_server/transport.rb +2 -0
  84. data/lib/solargraph/language_server/transport/adapter.rb +2 -0
  85. data/lib/solargraph/language_server/transport/data_reader.rb +3 -1
  86. data/lib/solargraph/language_server/uri_helpers.rb +2 -0
  87. data/lib/solargraph/library.rb +2 -0
  88. data/lib/solargraph/location.rb +2 -0
  89. data/lib/solargraph/logging.rb +2 -0
  90. data/lib/solargraph/page.rb +2 -0
  91. data/lib/solargraph/pin.rb +3 -20
  92. data/lib/solargraph/pin/attribute.rb +2 -4
  93. data/lib/solargraph/pin/base.rb +3 -5
  94. data/lib/solargraph/pin/base_method.rb +2 -4
  95. data/lib/solargraph/pin/base_variable.rb +2 -0
  96. data/lib/solargraph/pin/block.rb +2 -4
  97. data/lib/solargraph/pin/class_variable.rb +2 -3
  98. data/lib/solargraph/pin/closure.rb +9 -0
  99. data/lib/solargraph/pin/common.rb +3 -5
  100. data/lib/solargraph/pin/constant.rb +2 -4
  101. data/lib/solargraph/pin/conversions.rb +4 -2
  102. data/lib/solargraph/pin/documenting.rb +2 -0
  103. data/lib/solargraph/pin/duck_method.rb +2 -0
  104. data/lib/solargraph/pin/global_variable.rb +2 -3
  105. data/lib/solargraph/pin/instance_variable.rb +2 -4
  106. data/lib/solargraph/pin/keyword.rb +2 -4
  107. data/lib/solargraph/pin/keyword_param.rb +8 -0
  108. data/lib/solargraph/pin/local_variable.rb +2 -4
  109. data/lib/solargraph/pin/localized.rb +2 -0
  110. data/lib/solargraph/pin/method.rb +14 -4
  111. data/lib/solargraph/pin/method_alias.rb +2 -4
  112. data/lib/solargraph/pin/namespace.rb +22 -14
  113. data/lib/solargraph/pin/parameter.rb +4 -6
  114. data/lib/solargraph/pin/proxy_type.rb +2 -0
  115. data/lib/solargraph/pin/reference.rb +2 -0
  116. data/lib/solargraph/pin/reference/extend.rb +2 -3
  117. data/lib/solargraph/pin/reference/include.rb +2 -3
  118. data/lib/solargraph/pin/reference/override.rb +12 -3
  119. data/lib/solargraph/pin/reference/require.rb +2 -4
  120. data/lib/solargraph/pin/reference/superclass.rb +2 -3
  121. data/lib/solargraph/pin/singleton.rb +2 -0
  122. data/lib/solargraph/pin/symbol.rb +2 -4
  123. data/lib/solargraph/pin/yard_pin.rb +2 -0
  124. data/lib/solargraph/pin/yard_pin/constant.rb +7 -3
  125. data/lib/solargraph/pin/yard_pin/method.rb +12 -10
  126. data/lib/solargraph/pin/yard_pin/namespace.rb +9 -4
  127. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +30 -3
  128. data/lib/solargraph/position.rb +2 -0
  129. data/lib/solargraph/range.rb +2 -0
  130. data/lib/solargraph/server_methods.rb +2 -0
  131. data/lib/solargraph/shell.rb +33 -2
  132. data/lib/solargraph/source.rb +2 -0
  133. data/lib/solargraph/source/chain.rb +2 -0
  134. data/lib/solargraph/source/chain/call.rb +63 -14
  135. data/lib/solargraph/source/chain/class_variable.rb +2 -0
  136. data/lib/solargraph/source/chain/constant.rb +18 -11
  137. data/lib/solargraph/source/chain/global_variable.rb +2 -0
  138. data/lib/solargraph/source/chain/head.rb +2 -0
  139. data/lib/solargraph/source/chain/instance_variable.rb +2 -0
  140. data/lib/solargraph/source/chain/link.rb +2 -0
  141. data/lib/solargraph/source/chain/literal.rb +2 -0
  142. data/lib/solargraph/source/chain/or.rb +2 -0
  143. data/lib/solargraph/source/chain/variable.rb +2 -0
  144. data/lib/solargraph/source/change.rb +2 -0
  145. data/lib/solargraph/source/cursor.rb +4 -1
  146. data/lib/solargraph/source/encoding_fixes.rb +2 -0
  147. data/lib/solargraph/source/flawed_builder.rb +15 -13
  148. data/lib/solargraph/source/node_chainer.rb +2 -0
  149. data/lib/solargraph/source/node_methods.rb +9 -5
  150. data/lib/solargraph/source/source_chainer.rb +2 -0
  151. data/lib/solargraph/source/updater.rb +52 -50
  152. data/lib/solargraph/source_map.rb +15 -7
  153. data/lib/solargraph/source_map/clip.rb +35 -3
  154. data/lib/solargraph/source_map/completion.rb +2 -0
  155. data/lib/solargraph/source_map/mapper.rb +2 -0
  156. data/lib/solargraph/source_map/node_processor.rb +2 -0
  157. data/lib/solargraph/source_map/node_processor/alias_node.rb +2 -0
  158. data/lib/solargraph/source_map/node_processor/args_node.rb +2 -0
  159. data/lib/solargraph/source_map/node_processor/base.rb +5 -3
  160. data/lib/solargraph/source_map/node_processor/begin_node.rb +2 -0
  161. data/lib/solargraph/source_map/node_processor/block_node.rb +2 -0
  162. data/lib/solargraph/source_map/node_processor/casgn_node.rb +2 -0
  163. data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +2 -0
  164. data/lib/solargraph/source_map/node_processor/def_node.rb +2 -0
  165. data/lib/solargraph/source_map/node_processor/defs_node.rb +2 -0
  166. data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +2 -0
  167. data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +3 -1
  168. data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +2 -0
  169. data/lib/solargraph/source_map/node_processor/namespace_node.rb +4 -1
  170. data/lib/solargraph/source_map/node_processor/orasgn_node.rb +2 -0
  171. data/lib/solargraph/source_map/node_processor/resbody_node.rb +2 -0
  172. data/lib/solargraph/source_map/node_processor/sclass_node.rb +2 -0
  173. data/lib/solargraph/source_map/node_processor/send_node.rb +11 -6
  174. data/lib/solargraph/source_map/node_processor/sym_node.rb +2 -0
  175. data/lib/solargraph/source_map/region.rb +2 -0
  176. data/lib/solargraph/type_checker.rb +35 -17
  177. data/lib/solargraph/type_checker/param_def.rb +2 -0
  178. data/lib/solargraph/type_checker/problem.rb +2 -0
  179. data/lib/solargraph/version.rb +3 -1
  180. data/lib/solargraph/views/document.erb +3 -3
  181. data/lib/solargraph/views/environment.erb +3 -0
  182. data/lib/solargraph/workspace.rb +5 -1
  183. data/lib/solargraph/workspace/config.rb +14 -0
  184. data/lib/solargraph/yard_map.rb +64 -5
  185. data/lib/solargraph/yard_map/cache.rb +2 -0
  186. data/lib/solargraph/yard_map/core_docs.rb +2 -0
  187. data/lib/solargraph/yard_map/core_gen.rb +2 -0
  188. data/lib/solargraph/yard_map/mapper.rb +15 -14
  189. data/lib/solargraph/yard_map/rdoc_to_yard.rb +129 -0
  190. data/lib/yard-solargraph.rb +8 -0
  191. metadata +11 -2
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -14,7 +16,7 @@ module Solargraph
14
16
  if region.visibility == :module_function
15
17
  here = get_node_start_position(node)
16
18
  named_path = named_path_pin(here)
17
- if named_path.kind == Pin::METHOD
19
+ if named_path.is_a?(Pin::BaseMethod)
18
20
  pins.push Solargraph::Pin::InstanceVariable.new(
19
21
  location: loc,
20
22
  closure: Pin::Namespace.new(type: :module, closure: region.closure.closure, name: region.closure.name),
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -14,7 +16,8 @@ module Solargraph
14
16
  closure: region.closure,
15
17
  name: unpack_name(node.children[0]),
16
18
  comments: comments_for(node),
17
- visibility: :public
19
+ visibility: :public,
20
+ gates: region.closure.gates.freeze
18
21
  )
19
22
  pins.push nspin
20
23
  unless sc.nil?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -9,7 +11,7 @@ module Solargraph
9
11
  node.children[2..-1].each do |child|
10
12
  next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
11
13
  name = child.children[0].to_s
12
- matches = pins.select{ |pin| [Pin::METHOD, Pin::ATTRIBUTE].include?(pin.kind) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
14
+ matches = pins.select{ |pin| pin.is_a?(Pin::BaseMethod) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
13
15
  matches.each do |pin|
14
16
  # @todo Smelly instance variable access
15
17
  pin.instance_variable_set(:@visibility, node.children[1])
@@ -33,10 +35,12 @@ module Solargraph
33
35
  process_private_constant
34
36
  elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
35
37
  process_alias_method
36
- elsif node.children[1] == :private_class_method && node.children[2].kind_of?(AST::Node)
38
+ elsif node.children[1] == :private_class_method && node.children[2].is_a?(AST::Node)
37
39
  # Processing a private class can potentially handle children on its own
38
40
  return if process_private_class_method
39
41
  end
42
+ elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
43
+ pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
40
44
  end
41
45
  process_children
42
46
  end
@@ -76,7 +80,7 @@ module Solargraph
76
80
 
77
81
  # @return [void]
78
82
  def process_include
79
- if node.children[2].kind_of?(AST::Node) && node.children[2].type == :const
83
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
80
84
  cp = region.closure
81
85
  node.children[2..-1].each do |i|
82
86
  pins.push Pin::Reference::Include.new(
@@ -110,8 +114,9 @@ module Solargraph
110
114
 
111
115
  # @return [void]
112
116
  def process_require
113
- if node.children[2].kind_of?(AST::Node) && node.children[2].type == :str
114
- pins.push Pin::Reference::Require.new(get_node_location(node), node.children[2].children[0].to_s)
117
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
118
+ path = node.children[2].children[0].to_s
119
+ pins.push Pin::Reference::Require.new(get_node_location(node), path)
115
120
  end
116
121
  end
117
122
 
@@ -146,7 +151,7 @@ module Solargraph
146
151
  args: ref.parameters,
147
152
  node: ref.node)
148
153
  pins.push mm, cm
149
- pins.select{|pin| pin.kind == Pin::INSTANCE_VARIABLE && pin.closure.path == ref.path}.each do |ivar|
154
+ pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
150
155
  pins.delete ivar
151
156
  pins.push Solargraph::Pin::InstanceVariable.new(
152
157
  location: ivar.location,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  module NodeProcessor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class SourceMap
3
5
  # Data used by the NodeProcessor library to track context at various
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  # A static analysis tool for validating data types.
3
5
  #
@@ -38,6 +40,13 @@ module Solargraph
38
40
  def param_type_problems
39
41
  result = []
40
42
  smap = api_map.source_map(filename)
43
+ smap.pins.select { |pin| pin.is_a?(Pin::Method) }.each do |pin|
44
+ if pin.parameters.empty?
45
+ pin.docstring.tags(:param).each do |tag|
46
+ result.push Problem.new(pin.location, "#{pin.name} has unknown @param #{tag.name}", pin: pin)
47
+ end
48
+ end
49
+ end
41
50
  smap.locals.select { |pin| pin.is_a?(Solargraph::Pin::Parameter) }.each do |par|
42
51
  next unless par.closure.is_a?(Solargraph::Pin::Method)
43
52
  result.concat check_param_tags(par.closure)
@@ -106,7 +115,7 @@ module Solargraph
106
115
  # @param pin [Solargraph::Pin::Base]
107
116
  # @return [Array<Problem>]
108
117
  def confirm_return_type pin
109
- tagged = pin.typify(api_map)
118
+ tagged = pin.typify(api_map).self_to(pin.namespace)
110
119
  return [] if tagged.void? || tagged.undefined? || pin.is_a?(Pin::Attribute)
111
120
  probed = pin.probe(api_map)
112
121
  return [] if probed.undefined?
@@ -172,7 +181,11 @@ module Solargraph
172
181
  cursor = 0
173
182
  curtype = nil
174
183
  node.children[2..-1].each_with_index do |arg, index|
175
- curtype = ptypes[cursor] if curtype.nil? || curtype == :arg
184
+ if pin.is_a?(Pin::Attribute)
185
+ curtype = ParamDef.new('value', :arg)
186
+ else
187
+ curtype = ptypes[cursor] if curtype.nil? || curtype == :arg
188
+ end
176
189
  if curtype.nil?
177
190
  if pin.parameters[index].nil?
178
191
  result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Not enough arguments sent to #{pin.path}")
@@ -185,16 +198,10 @@ module Solargraph
185
198
  arg.children.each do |pair|
186
199
  sym = pair.children[0].children[0].to_s
187
200
  partype = params[pin.parameter_names[index]]
188
- if partype.nil?
189
- if report_location?(pin.location)
190
- unless ptypes.map(&:type).include?(:kwrestarg)
191
- result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "No @param type for #{pin.parameter_names[index]} in #{pin.path}")
192
- end
193
- end
194
- else
201
+ if partype
195
202
  chain = Solargraph::Source::NodeChainer.chain(pair.children[1], filename)
196
203
  argtype = chain.infer(api_map, block, locals)
197
- if argtype.tag != partype.tag
204
+ if argtype.tag != partype.tag && !api_map.super_and_sub?(partype.tag.to_s, argtype.tag.to_s)
198
205
  result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Wrong parameter type for #{pin.path}: #{pin.parameter_names[index]} expected #{partype.tag}, received #{argtype.tag}")
199
206
  end
200
207
  end
@@ -203,19 +210,21 @@ module Solargraph
203
210
  result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Can't handle splat in #{pin.parameter_names[index]} #{pin.path}")
204
211
  break if curtype != :arg && ptypes.map(&:type).include?(:restarg)
205
212
  else
206
- partype = params[pin.parameter_names[index]]
207
- if partype.nil?
208
- if report_location?(pin.location)
209
- result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "No @param type for #{pin.parameter_names[index]} in #{pin.path}")
210
- end
213
+ if pin.is_a?(Pin::Attribute)
214
+ partype = pin.return_type
211
215
  else
216
+ partype = params[pin.parameter_names[index]]
217
+ end
218
+ if partype
212
219
  arg = chain.links.last.arguments[index]
213
220
  if arg.nil?
214
221
  result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Wrong number of arguments to #{pin.path}")
215
222
  else
216
223
  argtype = arg.infer(api_map, block, locals)
217
- if argtype.tag != partype.tag
218
- result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Wrong parameter type for #{pin.path}: #{pin.parameter_names[index]} expected #{partype.tag}, received #{argtype.tag}")
224
+ if !arg_to_duck(argtype, partype)
225
+ if argtype.tag != partype.tag && !api_map.super_and_sub?(partype.tag.to_s, argtype.tag.to_s)
226
+ result.push Problem.new(Solargraph::Location.new(filename, Solargraph::Range.from_node(node)), "Wrong parameter type for #{pin.path}: #{pin.parameter_names[index]} expected #{partype.tag}, received #{argtype.tag}")
227
+ end
219
228
  end
220
229
  end
221
230
  end
@@ -233,6 +242,15 @@ module Solargraph
233
242
  result
234
243
  end
235
244
 
245
+ def arg_to_duck arg, par
246
+ return false unless par.duck_type?
247
+ meths = api_map.get_complex_type_methods(arg).map(&:name)
248
+ par.each do |quack|
249
+ return false unless meths.include?(quack.to_s[1..-1])
250
+ end
251
+ true
252
+ end
253
+
236
254
  # @param pin [Pin::Base]
237
255
  # @return [Hash]
238
256
  def param_tags_from pin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class TypeChecker
3
5
  # Data about a method parameter definition. This is the information from
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  class TypeChecker
3
5
  # A problem reported by TypeChecker.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
- VERSION = '0.33.2'
4
+ VERSION = '0.34.0'
3
5
  end
@@ -1,7 +1,7 @@
1
1
  <% objects.reverse.each do |object| %>
2
2
  <h1>
3
3
  <%= object.name %>
4
- <% if object.kind_of?(YARD::CodeObjects::MethodObject) and !object.parameters.empty? %>
4
+ <% if object.is_a?(YARD::CodeObjects::MethodObject) and !object.parameters.empty? %>
5
5
  <small>(<%= object.parameters.map {|p| "#{p[0]}#{p[1] and p[0].end_with?(':') ? ' ' : (p[1] ? ' = ' : '')}#{p[1]}"}.join(', ') %>)</small>
6
6
  <% end %>
7
7
  </h1>
@@ -15,9 +15,9 @@
15
15
  <% end %>
16
16
  </ul>
17
17
  <% end %>
18
- <% if object.kind_of?(YARD::CodeObjects::NamespaceObject) %>
18
+ <% if object.is_a?(YARD::CodeObjects::NamespaceObject) %>
19
19
  <%= erb :_namespace, layout: false, locals: {object: object} %>
20
- <% elsif object.kind_of?(YARD::CodeObjects::MethodObject) %>
20
+ <% elsif object.is_a?(YARD::CodeObjects::MethodObject) %>
21
21
  <%= erb :_method, layout: false, locals: {object: object} %>
22
22
  <% end %>
23
23
  <% end %>
@@ -18,6 +18,9 @@
18
18
  <li>
19
19
  Ruby Version: <%= RUBY_VERSION %>
20
20
  </li>
21
+ <li>
22
+ RuboCop Version: <%= RuboCop::Version::STRING %>
23
+ </li>
21
24
  </ul>
22
25
  <h2>
23
26
  Solargraph
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  # A workspace consists of the files in a project's directory and the
3
5
  # project's configuration. It provides a Source for each file to be used
@@ -113,7 +115,9 @@ module Solargraph
113
115
  # @return [Array<String>]
114
116
  def gemspecs
115
117
  return [] if directory.empty? || directory == '*'
116
- @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')]
118
+ @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')].select do |gs|
119
+ config.allow? gs
120
+ end
117
121
  end
118
122
 
119
123
  # Synchronize the workspace from the provided updater.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yaml'
2
4
 
3
5
  module Solargraph
@@ -56,6 +58,12 @@ module Solargraph
56
58
  @excluded ||= process_exclusions(@raw_data['exclude'])
57
59
  end
58
60
 
61
+ def allow? filename
62
+ filename.start_with?(directory) &&
63
+ !excluded.include?(filename) &&
64
+ excluded_directories.none? { |d| filename.start_with?(d) }
65
+ end
66
+
59
67
  # The calculated array of (included - excluded) files in the workspace.
60
68
  #
61
69
  # @return [Array<String>]
@@ -157,6 +165,12 @@ module Solargraph
157
165
  def glob_to_directory glob
158
166
  glob.gsub(/(\/\*|\/\*\*\/\*\*?)$/, '')
159
167
  end
168
+
169
+ def excluded_directories
170
+ @raw_data['exclude']
171
+ .select { |g| glob_is_directory?(g) }
172
+ .map { |g| File.join(directory, glob_to_directory(g)) }
173
+ end
160
174
  end
161
175
  end
162
176
  end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yard'
4
+ require 'bundler'
2
5
 
3
6
  module Solargraph
4
7
  # The YardMap provides access to YARD documentation for the Ruby core, the
@@ -9,6 +12,7 @@ module Solargraph
9
12
  autoload :CoreDocs, 'solargraph/yard_map/core_docs'
10
13
  autoload :CoreGen, 'solargraph/yard_map/core_gen'
11
14
  autoload :Mapper, 'solargraph/yard_map/mapper'
15
+ autoload :RdocToYard, 'solargraph/yard_map/rdoc_to_yard'
12
16
 
13
17
  CoreDocs.require_minimum
14
18
  @@stdlib_yardoc = CoreDocs.yardoc_stdlib_file
@@ -29,7 +33,8 @@ module Solargraph
29
33
 
30
34
  # @param required [Array<String>]
31
35
  # @param with_dependencies [Boolean]
32
- def initialize(required: [], with_dependencies: true)
36
+ def initialize(directory: '.', required: [], with_dependencies: true)
37
+ @directory = directory
33
38
  # HACK: YardMap needs its own copy of this array
34
39
  @required = required.clone
35
40
  @with_dependencies = with_dependencies
@@ -75,7 +80,7 @@ module Solargraph
75
80
  # @param y [String]
76
81
  # @return [YARD::Registry]
77
82
  def load_yardoc y
78
- if y.kind_of?(Array)
83
+ if y.is_a?(Array)
79
84
  YARD::Registry.load y, true
80
85
  else
81
86
  YARD::Registry.load! y
@@ -90,7 +95,18 @@ module Solargraph
90
95
  def core_pins
91
96
  @@core_pins ||= begin
92
97
  load_yardoc CoreDocs.yardoc_file
93
- Mapper.new(YARD::Registry.all).map
98
+ result = Mapper.new(YARD::Registry.all).map
99
+ CoreFills::OVERRIDES.each do |ovr|
100
+ pin = result.select { |p| p.path == ovr.name }.first
101
+ next if pin.nil?
102
+ (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
103
+ pin.docstring.delete_tags tag.to_sym
104
+ end
105
+ ovr.tags.each do |tag|
106
+ pin.docstring.add_tag(tag)
107
+ end
108
+ end
109
+ result
94
110
  end
95
111
  end
96
112
 
@@ -141,6 +157,7 @@ module Solargraph
141
157
  unresolved_requires.clear
142
158
  stdnames = {}
143
159
  done = []
160
+ pins.concat(bundler_require) if required.include?('bundler/require')
144
161
  required.each do |r|
145
162
  next if r.nil? || r.empty? || done.include?(r)
146
163
  done.push r
@@ -154,7 +171,7 @@ module Solargraph
154
171
  spec = Gem::Specification.find_by_path(r) || Gem::Specification.find_by_name(r.split('/').first)
155
172
  ver = spec.version.to_s
156
173
  ver = ">= 0" if ver.empty?
157
- yd = YARD::Registry.yardoc_file_for_gem(spec.name, ver)
174
+ yd = yardoc_file_for_spec(spec)
158
175
  # YARD detects gems for certain libraries that do not have a yardoc
159
176
  # but exist in the stdlib. `fileutils` is an example. Treat those
160
177
  # cases as errors and check the stdlib yardoc.
@@ -219,7 +236,7 @@ module Solargraph
219
236
  depspec = Gem::Specification.find_by_name(dep.name)
220
237
  next if depspec.nil? || @gem_paths.key?(depspec.name)
221
238
  @gem_paths[depspec.name] = depspec.full_gem_path
222
- gy = YARD::Registry.yardoc_file_for_gem(dep.name)
239
+ gy = yardoc_file_for_spec(depspec)
223
240
  if gy.nil?
224
241
  unresolved_requires.push dep.name
225
242
  else
@@ -250,5 +267,47 @@ module Solargraph
250
267
  load_yardoc y
251
268
  Mapper.new(YARD::Registry.all, spec).map
252
269
  end
270
+
271
+ def bundler_require
272
+ Solargraph.logger.debug "Using bundler/require"
273
+ result = []
274
+ Dir.chdir @directory do
275
+ # @type [Array<Gem::Specification>]
276
+ specs = Bundler.with_original_env do
277
+ Bundler.reset!
278
+ Bundler.definition.specs_for([:default])
279
+ end
280
+ specs.each do |spec|
281
+ ver = spec.version.to_s
282
+ ver = ">= 0" if ver.empty?
283
+ yd = yardoc_file_for_spec(spec)
284
+ # YARD detects gems for certain libraries that do not have a yardoc
285
+ # but exist in the stdlib. `fileutils` is an example. Treat those
286
+ # cases as errors and check the stdlib yardoc.
287
+ if yd.nil?
288
+ Solargraph.logger.warn "Failed to load gem #{spec.name} #{ver} via bundler/require"
289
+ next
290
+ end
291
+ @gem_paths[spec.name] = spec.full_gem_path
292
+ unless yardocs.include?(yd)
293
+ yardocs.unshift yd
294
+ result.concat process_yardoc yd, spec
295
+ result.concat add_gem_dependencies(spec) if with_dependencies?
296
+ end
297
+ end
298
+ end
299
+ Bundler.reset!
300
+ result.reject(&:nil?)
301
+ end
302
+
303
+ def yardoc_file_for_spec spec
304
+ cache_dir = File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{spec.name}-#{spec.version}", 'yardoc')
305
+ if File.exist?(cache_dir)
306
+ Solargraph.logger.info "Using cached documentation for #{spec.name} at #{cache_dir}"
307
+ cache_dir
308
+ else
309
+ YARD::Registry.yardoc_file_for_gem(spec.name, spec.version)
310
+ end
311
+ end
253
312
  end
254
313
  end