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.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/README.md +1 -1
- data/lib/solargraph.rb +5 -0
- data/lib/solargraph/api_map.rb +36 -18
- data/lib/solargraph/api_map/cache.rb +2 -0
- data/lib/solargraph/api_map/source_to_yard.rb +14 -5
- data/lib/solargraph/api_map/store.rb +17 -19
- data/lib/solargraph/bundle.rb +2 -0
- data/lib/solargraph/complex_type.rb +18 -4
- data/lib/solargraph/complex_type/type_methods.rb +2 -0
- data/lib/solargraph/complex_type/unique_type.rb +2 -0
- data/lib/solargraph/convention.rb +38 -0
- data/lib/solargraph/convention/base.rb +28 -0
- data/lib/solargraph/convention/gemfile.rb +18 -0
- data/lib/solargraph/convention/gemspec.rb +25 -0
- data/lib/solargraph/convention/rspec.rb +23 -0
- data/lib/solargraph/core_fills.rb +66 -42
- data/lib/solargraph/diagnostics.rb +2 -0
- data/lib/solargraph/diagnostics/base.rb +2 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +2 -0
- data/lib/solargraph/diagnostics/rubocop.rb +2 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
- data/lib/solargraph/diagnostics/severities.rb +15 -13
- data/lib/solargraph/diagnostics/type_check.rb +2 -0
- data/lib/solargraph/diagnostics/update_errors.rb +2 -0
- data/lib/solargraph/documentor.rb +42 -0
- data/lib/solargraph/environ.rb +40 -0
- data/lib/solargraph/language_server.rb +19 -17
- data/lib/solargraph/language_server/completion_item_kinds.rb +2 -0
- data/lib/solargraph/language_server/error_codes.rb +2 -0
- data/lib/solargraph/language_server/host.rb +3 -1
- data/lib/solargraph/language_server/host/cataloger.rb +2 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -0
- data/lib/solargraph/language_server/host/dispatch.rb +2 -0
- data/lib/solargraph/language_server/host/sources.rb +2 -0
- data/lib/solargraph/language_server/message.rb +2 -0
- data/lib/solargraph/language_server/message/base.rb +2 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -11
- data/lib/solargraph/language_server/message/client.rb +11 -9
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -13
- data/lib/solargraph/language_server/message/completion_item.rb +11 -9
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +2 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +2 -0
- data/lib/solargraph/language_server/message/extended.rb +2 -0
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
- data/lib/solargraph/language_server/message/extended/document.rb +2 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +2 -0
- data/lib/solargraph/language_server/message/extended/download_core.rb +27 -25
- data/lib/solargraph/language_server/message/extended/environment.rb +5 -0
- data/lib/solargraph/language_server/message/extended/search.rb +2 -0
- data/lib/solargraph/language_server/message/initialize.rb +2 -0
- data/lib/solargraph/language_server/message/initialized.rb +2 -0
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -14
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -12
- data/lib/solargraph/language_server/message/shutdown.rb +2 -0
- data/lib/solargraph/language_server/message/text_document.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -17
- data/lib/solargraph/language_server/message/text_document/code_action.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/did_change.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -13
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -13
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -15
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -1
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/references.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/rename.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +7 -1
- data/lib/solargraph/language_server/message/workspace.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
- data/lib/solargraph/language_server/message_types.rb +14 -12
- data/lib/solargraph/language_server/request.rb +2 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +2 -0
- data/lib/solargraph/language_server/transport.rb +2 -0
- data/lib/solargraph/language_server/transport/adapter.rb +2 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +3 -1
- data/lib/solargraph/language_server/uri_helpers.rb +2 -0
- data/lib/solargraph/library.rb +2 -0
- data/lib/solargraph/location.rb +2 -0
- data/lib/solargraph/logging.rb +2 -0
- data/lib/solargraph/page.rb +2 -0
- data/lib/solargraph/pin.rb +3 -20
- data/lib/solargraph/pin/attribute.rb +2 -4
- data/lib/solargraph/pin/base.rb +3 -5
- data/lib/solargraph/pin/base_method.rb +2 -4
- data/lib/solargraph/pin/base_variable.rb +2 -0
- data/lib/solargraph/pin/block.rb +2 -4
- data/lib/solargraph/pin/class_variable.rb +2 -3
- data/lib/solargraph/pin/closure.rb +9 -0
- data/lib/solargraph/pin/common.rb +3 -5
- data/lib/solargraph/pin/constant.rb +2 -4
- data/lib/solargraph/pin/conversions.rb +4 -2
- data/lib/solargraph/pin/documenting.rb +2 -0
- data/lib/solargraph/pin/duck_method.rb +2 -0
- data/lib/solargraph/pin/global_variable.rb +2 -3
- data/lib/solargraph/pin/instance_variable.rb +2 -4
- data/lib/solargraph/pin/keyword.rb +2 -4
- data/lib/solargraph/pin/keyword_param.rb +8 -0
- data/lib/solargraph/pin/local_variable.rb +2 -4
- data/lib/solargraph/pin/localized.rb +2 -0
- data/lib/solargraph/pin/method.rb +14 -4
- data/lib/solargraph/pin/method_alias.rb +2 -4
- data/lib/solargraph/pin/namespace.rb +22 -14
- data/lib/solargraph/pin/parameter.rb +4 -6
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +2 -0
- data/lib/solargraph/pin/reference/extend.rb +2 -3
- data/lib/solargraph/pin/reference/include.rb +2 -3
- data/lib/solargraph/pin/reference/override.rb +12 -3
- data/lib/solargraph/pin/reference/require.rb +2 -4
- data/lib/solargraph/pin/reference/superclass.rb +2 -3
- data/lib/solargraph/pin/singleton.rb +2 -0
- data/lib/solargraph/pin/symbol.rb +2 -4
- data/lib/solargraph/pin/yard_pin.rb +2 -0
- data/lib/solargraph/pin/yard_pin/constant.rb +7 -3
- data/lib/solargraph/pin/yard_pin/method.rb +12 -10
- data/lib/solargraph/pin/yard_pin/namespace.rb +9 -4
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +30 -3
- data/lib/solargraph/position.rb +2 -0
- data/lib/solargraph/range.rb +2 -0
- data/lib/solargraph/server_methods.rb +2 -0
- data/lib/solargraph/shell.rb +33 -2
- data/lib/solargraph/source.rb +2 -0
- data/lib/solargraph/source/chain.rb +2 -0
- data/lib/solargraph/source/chain/call.rb +63 -14
- data/lib/solargraph/source/chain/class_variable.rb +2 -0
- data/lib/solargraph/source/chain/constant.rb +18 -11
- data/lib/solargraph/source/chain/global_variable.rb +2 -0
- data/lib/solargraph/source/chain/head.rb +2 -0
- data/lib/solargraph/source/chain/instance_variable.rb +2 -0
- data/lib/solargraph/source/chain/link.rb +2 -0
- data/lib/solargraph/source/chain/literal.rb +2 -0
- data/lib/solargraph/source/chain/or.rb +2 -0
- data/lib/solargraph/source/chain/variable.rb +2 -0
- data/lib/solargraph/source/change.rb +2 -0
- data/lib/solargraph/source/cursor.rb +4 -1
- data/lib/solargraph/source/encoding_fixes.rb +2 -0
- data/lib/solargraph/source/flawed_builder.rb +15 -13
- data/lib/solargraph/source/node_chainer.rb +2 -0
- data/lib/solargraph/source/node_methods.rb +9 -5
- data/lib/solargraph/source/source_chainer.rb +2 -0
- data/lib/solargraph/source/updater.rb +52 -50
- data/lib/solargraph/source_map.rb +15 -7
- data/lib/solargraph/source_map/clip.rb +35 -3
- data/lib/solargraph/source_map/completion.rb +2 -0
- data/lib/solargraph/source_map/mapper.rb +2 -0
- data/lib/solargraph/source_map/node_processor.rb +2 -0
- data/lib/solargraph/source_map/node_processor/alias_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/args_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/base.rb +5 -3
- data/lib/solargraph/source_map/node_processor/begin_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/block_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/casgn_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/def_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/defs_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +3 -1
- data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/namespace_node.rb +4 -1
- data/lib/solargraph/source_map/node_processor/orasgn_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/resbody_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/sclass_node.rb +2 -0
- data/lib/solargraph/source_map/node_processor/send_node.rb +11 -6
- data/lib/solargraph/source_map/node_processor/sym_node.rb +2 -0
- data/lib/solargraph/source_map/region.rb +2 -0
- data/lib/solargraph/type_checker.rb +35 -17
- data/lib/solargraph/type_checker/param_def.rb +2 -0
- data/lib/solargraph/type_checker/problem.rb +2 -0
- data/lib/solargraph/version.rb +3 -1
- data/lib/solargraph/views/document.erb +3 -3
- data/lib/solargraph/views/environment.erb +3 -0
- data/lib/solargraph/workspace.rb +5 -1
- data/lib/solargraph/workspace/config.rb +14 -0
- data/lib/solargraph/yard_map.rb +64 -5
- data/lib/solargraph/yard_map/cache.rb +2 -0
- data/lib/solargraph/yard_map/core_docs.rb +2 -0
- data/lib/solargraph/yard_map/core_gen.rb +2 -0
- data/lib/solargraph/yard_map/mapper.rb +15 -14
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +129 -0
- data/lib/yard-solargraph.rb +8 -0
- 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
|
|
@@ -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.
|
|
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
|
|
@@ -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
|
|
@@ -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|
|
|
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].
|
|
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].
|
|
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].
|
|
114
|
-
|
|
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.
|
|
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
|
# 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
|
-
|
|
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
|
|
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
|
-
|
|
207
|
-
|
|
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
|
|
218
|
-
|
|
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
|
data/lib/solargraph/version.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<% objects.reverse.each do |object| %>
|
|
2
2
|
<h1>
|
|
3
3
|
<%= object.name %>
|
|
4
|
-
<% if object.
|
|
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.
|
|
18
|
+
<% if object.is_a?(YARD::CodeObjects::NamespaceObject) %>
|
|
19
19
|
<%= erb :_namespace, layout: false, locals: {object: object} %>
|
|
20
|
-
<% elsif object.
|
|
20
|
+
<% elsif object.is_a?(YARD::CodeObjects::MethodObject) %>
|
|
21
21
|
<%= erb :_method, layout: false, locals: {object: object} %>
|
|
22
22
|
<% end %>
|
|
23
23
|
<% end %>
|
data/lib/solargraph/workspace.rb
CHANGED
|
@@ -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
|
data/lib/solargraph/yard_map.rb
CHANGED
|
@@ -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.
|
|
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 =
|
|
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 =
|
|
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
|