solargraph 0.59.0.dev.1 → 0.59.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/.github/workflows/linting.yml +3 -1
- data/.github/workflows/plugins.yml +12 -3
- data/.github/workflows/rspec.yml +9 -54
- data/.github/workflows/typecheck.yml +2 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +40 -931
- data/CHANGELOG.md +22 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/constants.rb +0 -1
- data/lib/solargraph/api_map/index.rb +11 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +28 -20
- data/lib/solargraph/api_map.rb +70 -41
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +14 -16
- data/lib/solargraph/complex_type/unique_type.rb +56 -47
- data/lib/solargraph/complex_type.rb +70 -62
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +370 -132
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +19 -18
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +68 -95
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -6
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -44
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -6
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -2
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +76 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +74 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +18 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +71 -488
- data/lib/solargraph/position.rb +38 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +327 -221
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +5 -15
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +224 -66
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +26 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +51 -47
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -102
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +11 -10
- data/lib/solargraph/workspace/gemspecs.rb +3 -3
- data/lib/solargraph/workspace.rb +45 -165
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +26 -33
- data/lib/solargraph.rb +7 -5
- data/solargraph.gemspec +36 -35
- metadata +33 -38
data/lib/solargraph/api_map.rb
CHANGED
|
@@ -51,15 +51,15 @@ module Solargraph
|
|
|
51
51
|
#
|
|
52
52
|
|
|
53
53
|
# @param other [Object]
|
|
54
|
-
def eql?
|
|
54
|
+
def eql? other
|
|
55
55
|
self.class == other.class &&
|
|
56
56
|
# @sg-ignore flow sensitive typing needs to handle self.class == other.class
|
|
57
57
|
equality_fields == other.equality_fields
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
# @param other [Object]
|
|
61
|
-
def ==
|
|
62
|
-
|
|
61
|
+
def == other
|
|
62
|
+
eql?(other)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
# @return [Integer]
|
|
@@ -115,8 +115,9 @@ module Solargraph
|
|
|
115
115
|
end
|
|
116
116
|
unresolved_requires = (bench.external_requires + conventions_environ.requires + bench.workspace.config.required).to_a.compact.uniq
|
|
117
117
|
recreate_docmap = @unresolved_requires != unresolved_requires ||
|
|
118
|
+
# @sg-ignore Unresolved call to rbs_collection_path on Solargraph::Workspace, nil
|
|
118
119
|
workspace.rbs_collection_path != bench.workspace.rbs_collection_path ||
|
|
119
|
-
@doc_map.
|
|
120
|
+
@doc_map.uncached_gemspecs.any?
|
|
120
121
|
|
|
121
122
|
if recreate_docmap
|
|
122
123
|
@doc_map = DocMap.new(unresolved_requires, bench.workspace, out: nil) # @todo Implement gem preferences
|
|
@@ -127,13 +128,6 @@ module Solargraph
|
|
|
127
128
|
self
|
|
128
129
|
end
|
|
129
130
|
|
|
130
|
-
# @todo need to model type def statement in chains as a symbol so
|
|
131
|
-
# that this overload of 'protected' will typecheck @sg-ignore
|
|
132
|
-
# @sg-ignore
|
|
133
|
-
protected def equality_fields
|
|
134
|
-
[self.class, @source_map_hash, conventions_environ, @doc_map, @unresolved_requires, @missing_docs, @loose_unions]
|
|
135
|
-
end
|
|
136
|
-
|
|
137
131
|
# @return [DocMap]
|
|
138
132
|
def doc_map
|
|
139
133
|
@doc_map ||= DocMap.new([], Workspace.new('.'))
|
|
@@ -144,6 +138,16 @@ module Solargraph
|
|
|
144
138
|
doc_map.uncached_gemspecs || []
|
|
145
139
|
end
|
|
146
140
|
|
|
141
|
+
# @return [::Array<Gem::Specification>]
|
|
142
|
+
def uncached_rbs_collection_gemspecs
|
|
143
|
+
@doc_map.uncached_rbs_collection_gemspecs
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @return [::Array<Gem::Specification>]
|
|
147
|
+
def uncached_yard_gemspecs
|
|
148
|
+
@doc_map.uncached_yard_gemspecs
|
|
149
|
+
end
|
|
150
|
+
|
|
147
151
|
# @return [Enumerable<Pin::Base>]
|
|
148
152
|
def core_pins
|
|
149
153
|
@@core_map.pins
|
|
@@ -205,14 +209,14 @@ module Solargraph
|
|
|
205
209
|
# @param rebuild [Boolean] whether to rebuild the pins even if they are cached
|
|
206
210
|
# @return [void]
|
|
207
211
|
def cache_all_for_doc_map! out: $stderr, rebuild: false
|
|
208
|
-
doc_map.
|
|
212
|
+
doc_map.cache_all!(out, rebuild: rebuild)
|
|
209
213
|
end
|
|
210
214
|
|
|
211
215
|
# @param gemspec [Gem::Specification]
|
|
212
216
|
# @param rebuild [Boolean]
|
|
213
217
|
# @param out [StringIO, IO, nil]
|
|
214
218
|
# @return [void]
|
|
215
|
-
def cache_gem
|
|
219
|
+
def cache_gem gemspec, rebuild: false, out: nil
|
|
216
220
|
doc_map.cache(gemspec, rebuild: rebuild, out: out)
|
|
217
221
|
end
|
|
218
222
|
|
|
@@ -252,6 +256,12 @@ module Solargraph
|
|
|
252
256
|
store.pins_by_class(Pin::Keyword)
|
|
253
257
|
end
|
|
254
258
|
|
|
259
|
+
# @param name [String]
|
|
260
|
+
# @return [ComplexType, nil]
|
|
261
|
+
def unalias name
|
|
262
|
+
store.unalias(name)
|
|
263
|
+
end
|
|
264
|
+
|
|
255
265
|
# True if the namespace exists.
|
|
256
266
|
#
|
|
257
267
|
# @param name [String] The namespace to match
|
|
@@ -317,19 +327,19 @@ module Solargraph
|
|
|
317
327
|
#
|
|
318
328
|
# @param pin [Pin::Reference]
|
|
319
329
|
# @return [String, nil]
|
|
320
|
-
def dereference
|
|
330
|
+
def dereference pin
|
|
321
331
|
store.constants.dereference(pin)
|
|
322
332
|
end
|
|
323
333
|
|
|
324
334
|
# @param fqns [String]
|
|
325
335
|
# @return [Array<Pin::Reference::Extend>]
|
|
326
|
-
def get_extends
|
|
336
|
+
def get_extends fqns
|
|
327
337
|
store.get_extends(fqns)
|
|
328
338
|
end
|
|
329
339
|
|
|
330
340
|
# @param fqns [String]
|
|
331
341
|
# @return [Array<Pin::Reference::Include>]
|
|
332
|
-
def get_includes
|
|
342
|
+
def get_includes fqns
|
|
333
343
|
store.get_includes(fqns)
|
|
334
344
|
end
|
|
335
345
|
|
|
@@ -341,7 +351,7 @@ module Solargraph
|
|
|
341
351
|
# @return [Array<Solargraph::Pin::InstanceVariable>]
|
|
342
352
|
def get_instance_variable_pins namespace, scope = :instance
|
|
343
353
|
result = []
|
|
344
|
-
|
|
354
|
+
[namespace]
|
|
345
355
|
result.concat store.get_instance_variables(namespace, scope)
|
|
346
356
|
sc_fqns = namespace
|
|
347
357
|
while (sc = store.get_superclass(sc_fqns))
|
|
@@ -364,12 +374,12 @@ module Solargraph
|
|
|
364
374
|
# @param location [Location]
|
|
365
375
|
#
|
|
366
376
|
# @return [Pin::BaseVariable, nil]
|
|
367
|
-
def var_at_location
|
|
368
|
-
with_correct_name = candidates.select { |pin| pin.name == name}
|
|
377
|
+
def var_at_location candidates, name, closure, location
|
|
378
|
+
with_correct_name = candidates.select { |pin| pin.name == name }
|
|
369
379
|
vars_at_location = with_correct_name.reject do |pin|
|
|
370
380
|
# visible_at? excludes the starting position, but we want to
|
|
371
381
|
# include it for this purpose
|
|
372
|
-
|
|
382
|
+
!pin.visible_at?(closure, location) && !pin.starts_at?(location)
|
|
373
383
|
end
|
|
374
384
|
|
|
375
385
|
vars_at_location.inject(&:combine_with)
|
|
@@ -446,7 +456,7 @@ module Solargraph
|
|
|
446
456
|
comments: init_pin.comments,
|
|
447
457
|
closure: init_pin.closure,
|
|
448
458
|
source: init_pin.source,
|
|
449
|
-
type_location: init_pin.type_location
|
|
459
|
+
type_location: init_pin.type_location
|
|
450
460
|
)
|
|
451
461
|
new_pin.parameters = init_pin.parameters.map do |init_param|
|
|
452
462
|
param = init_param.clone
|
|
@@ -505,7 +515,7 @@ module Solargraph
|
|
|
505
515
|
result = Set.new
|
|
506
516
|
complex_type.each do |type|
|
|
507
517
|
if type.duck_type?
|
|
508
|
-
result.add Pin::DuckMethod.new(name: type.to_s[1
|
|
518
|
+
result.add Pin::DuckMethod.new(name: type.to_s[1..], source: :api_map)
|
|
509
519
|
result.merge get_methods('Object')
|
|
510
520
|
else
|
|
511
521
|
unless type.nil? || type.name == 'void'
|
|
@@ -536,7 +546,8 @@ module Solargraph
|
|
|
536
546
|
# @param preserve_generics [Boolean] True to preserve any
|
|
537
547
|
# unresolved generic parameters, false to erase them
|
|
538
548
|
# @return [Array<Solargraph::Pin::Method>]
|
|
539
|
-
def get_method_stack rooted_tag, name, scope: :instance, visibility: [
|
|
549
|
+
def get_method_stack rooted_tag, name, scope: :instance, visibility: %i[private protected public],
|
|
550
|
+
preserve_generics: false
|
|
540
551
|
rooted_type = ComplexType.parse(rooted_tag)
|
|
541
552
|
fqns = rooted_type.namespace
|
|
542
553
|
namespace_pin = store.get_path_pins(fqns).first
|
|
@@ -619,7 +630,6 @@ module Solargraph
|
|
|
619
630
|
# @param cursor [Source::Cursor]
|
|
620
631
|
# @return [SourceMap::Clip]
|
|
621
632
|
def clip cursor
|
|
622
|
-
# @sg-ignore Need to add nil check here
|
|
623
633
|
raise FileNotFoundError, "ApiMap did not catalog #{cursor.filename}" unless source_map_hash.key?(cursor.filename)
|
|
624
634
|
|
|
625
635
|
SourceMap::Clip.new(self, cursor)
|
|
@@ -661,7 +671,7 @@ module Solargraph
|
|
|
661
671
|
# @param sup [String] The superclass
|
|
662
672
|
# @param sub [String] The subclass
|
|
663
673
|
# @return [Boolean]
|
|
664
|
-
def super_and_sub?
|
|
674
|
+
def super_and_sub? sup, sub
|
|
665
675
|
sup = ComplexType.try_parse(sup)
|
|
666
676
|
sub = ComplexType.try_parse(sub)
|
|
667
677
|
# @todo If two literals are different values of the same type, it would
|
|
@@ -693,14 +703,14 @@ module Solargraph
|
|
|
693
703
|
# @param module_ns [String] The module namespace (no type parameters)
|
|
694
704
|
#
|
|
695
705
|
# @return [Boolean]
|
|
696
|
-
def type_include?
|
|
706
|
+
def type_include? host_ns, module_ns
|
|
697
707
|
store.get_includes(host_ns).map { |inc_tag| inc_tag.type.name }.include?(module_ns)
|
|
698
708
|
end
|
|
699
709
|
|
|
700
710
|
# @param pins [Enumerable<Pin::Base>]
|
|
701
711
|
# @param visibility [Enumerable<Symbol>]
|
|
702
712
|
# @return [Array<Pin::Base>]
|
|
703
|
-
def resolve_method_aliases pins, visibility = [
|
|
713
|
+
def resolve_method_aliases pins, visibility = %i[public private protected]
|
|
704
714
|
with_resolved_aliases = pins.map do |pin|
|
|
705
715
|
next pin unless pin.is_a?(Pin::MethodAlias)
|
|
706
716
|
resolved = resolve_method_alias(pin)
|
|
@@ -714,7 +724,7 @@ module Solargraph
|
|
|
714
724
|
GemPins.combine_method_pins_by_path(with_resolved_aliases)
|
|
715
725
|
end
|
|
716
726
|
|
|
717
|
-
# @return [Workspace]
|
|
727
|
+
# @return [Workspace, nil]
|
|
718
728
|
def workspace
|
|
719
729
|
doc_map.workspace
|
|
720
730
|
end
|
|
@@ -730,7 +740,7 @@ module Solargraph
|
|
|
730
740
|
# @param skip [Set<String>]
|
|
731
741
|
# @param no_core [Boolean] Skip core classes if true
|
|
732
742
|
# @return [Array<Pin::Base>]
|
|
733
|
-
def inner_get_methods_from_reference
|
|
743
|
+
def inner_get_methods_from_reference fq_reference_tag, namespace_pin, type, scope, visibility, deep, skip, no_core
|
|
734
744
|
logger.debug { "ApiMap#add_methods_from_reference(type=#{type}) starting" }
|
|
735
745
|
|
|
736
746
|
# Ensure the types returned by the methods in the referenced
|
|
@@ -786,7 +796,7 @@ module Solargraph
|
|
|
786
796
|
def inner_get_methods rooted_tag, scope, visibility, deep, skip, no_core = false
|
|
787
797
|
rooted_type = ComplexType.parse(rooted_tag).force_rooted
|
|
788
798
|
fqns = rooted_type.namespace
|
|
789
|
-
|
|
799
|
+
rooted_type.all_params
|
|
790
800
|
namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
|
|
791
801
|
return [] if no_core && fqns =~ /^(Object|BasicObject|Class|Module)$/
|
|
792
802
|
reqstr = "#{fqns}|#{scope}|#{visibility.sort}|#{deep}"
|
|
@@ -797,7 +807,9 @@ module Solargraph
|
|
|
797
807
|
# ensure we start out with any immediate methods in this
|
|
798
808
|
# namespace so we roughly match the same ordering of get_methods
|
|
799
809
|
# and obey the 'deep' instruction
|
|
800
|
-
direct_convention_methods, convention_methods_by_reference = environ.pins.partition
|
|
810
|
+
direct_convention_methods, convention_methods_by_reference = environ.pins.partition do |p|
|
|
811
|
+
p.namespace == rooted_tag
|
|
812
|
+
end
|
|
801
813
|
result.concat direct_convention_methods
|
|
802
814
|
|
|
803
815
|
if deep && scope == :instance
|
|
@@ -809,8 +821,10 @@ module Solargraph
|
|
|
809
821
|
# Store#get_methods doesn't know about full tags, just
|
|
810
822
|
# namespaces; resolving the generics in the method pins is this
|
|
811
823
|
# class' responsibility
|
|
812
|
-
methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort{ |a, b| a.name <=> b.name }
|
|
813
|
-
logger.info
|
|
824
|
+
methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort { |a, b| a.name <=> b.name }
|
|
825
|
+
logger.info do
|
|
826
|
+
"ApiMap#inner_get_methods(rooted_tag=#{rooted_tag.inspect}, scope=#{scope.inspect}, visibility=#{visibility.inspect}, deep=#{deep.inspect}, skip=#{skip.inspect}, fqns=#{fqns}) - added from store: #{methods}"
|
|
827
|
+
end
|
|
814
828
|
result.concat methods
|
|
815
829
|
if deep
|
|
816
830
|
result.concat convention_methods_by_reference
|
|
@@ -819,7 +833,8 @@ module Solargraph
|
|
|
819
833
|
store.get_includes(fqns).reverse.each do |ref|
|
|
820
834
|
in_tag = dereference(ref)
|
|
821
835
|
# @sg-ignore Need to add nil check here
|
|
822
|
-
result.concat inner_get_methods_from_reference(in_tag, namespace_pin, rooted_type, scope, visibility, deep,
|
|
836
|
+
result.concat inner_get_methods_from_reference(in_tag, namespace_pin, rooted_type, scope, visibility, deep,
|
|
837
|
+
skip, true)
|
|
823
838
|
end
|
|
824
839
|
rooted_sc_tag = qualify_superclass(rooted_tag)
|
|
825
840
|
unless rooted_sc_tag.nil?
|
|
@@ -827,7 +842,9 @@ module Solargraph
|
|
|
827
842
|
visibility, true, skip, no_core)
|
|
828
843
|
end
|
|
829
844
|
else
|
|
830
|
-
logger.info
|
|
845
|
+
logger.info do
|
|
846
|
+
"ApiMap#inner_get_methods(#{fqns}, #{scope}, #{visibility}, #{deep}, #{skip}) - looking for get_extends() from #{fqns}"
|
|
847
|
+
end
|
|
831
848
|
store.get_extends(fqns).reverse.each do |em|
|
|
832
849
|
fqem = dereference(em)
|
|
833
850
|
result.concat inner_get_methods(fqem, :instance, visibility, deep, skip, true) unless fqem.nil?
|
|
@@ -863,7 +880,7 @@ module Solargraph
|
|
|
863
880
|
def get_namespace_type fqns
|
|
864
881
|
return nil if fqns.nil?
|
|
865
882
|
# @type [Pin::Namespace, nil]
|
|
866
|
-
pin = store.get_path_pins(fqns).select{|p| p.is_a?(Pin::Namespace)}.first
|
|
883
|
+
pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
|
|
867
884
|
return nil if pin.nil?
|
|
868
885
|
pin.type
|
|
869
886
|
end
|
|
@@ -889,7 +906,7 @@ module Solargraph
|
|
|
889
906
|
|
|
890
907
|
# @param alias_pin [Pin::MethodAlias]
|
|
891
908
|
# @return [Pin::Method, nil]
|
|
892
|
-
def resolve_method_alias
|
|
909
|
+
def resolve_method_alias alias_pin
|
|
893
910
|
ancestors = store.get_ancestors(alias_pin.full_context.reduce_class_type.tag)
|
|
894
911
|
# @type [Pin::Method, nil]
|
|
895
912
|
original = nil
|
|
@@ -920,7 +937,9 @@ module Solargraph
|
|
|
920
937
|
end
|
|
921
938
|
if original.nil?
|
|
922
939
|
# :nocov:
|
|
923
|
-
Solargraph.assert_or_log(:alias_target_missing)
|
|
940
|
+
Solargraph.assert_or_log(:alias_target_missing) do
|
|
941
|
+
"Rejecting alias - target is missing while looking for #{alias_pin.full_context.tag} #{alias_pin.original} in #{alias_pin.scope} scope = #{alias_pin.inspect}"
|
|
942
|
+
end
|
|
924
943
|
return nil
|
|
925
944
|
# :nocov:
|
|
926
945
|
end
|
|
@@ -933,7 +952,7 @@ module Solargraph
|
|
|
933
952
|
# @param alias_pin [Pin::MethodAlias] The alias pin to resolve
|
|
934
953
|
# @param original [Pin::Method] The original method pin that was already found
|
|
935
954
|
# @return [Pin::Method] The resolved method pin
|
|
936
|
-
def create_resolved_alias_pin
|
|
955
|
+
def create_resolved_alias_pin alias_pin, original
|
|
937
956
|
# Build the resolved method pin directly (same logic as resolve_method_alias but without lookup)
|
|
938
957
|
args = {
|
|
939
958
|
location: alias_pin.location,
|
|
@@ -949,7 +968,7 @@ module Solargraph
|
|
|
949
968
|
return_type: original.return_type,
|
|
950
969
|
source: :resolve_method_alias
|
|
951
970
|
}
|
|
952
|
-
resolved_pin = Pin::Method.new
|
|
971
|
+
resolved_pin = Pin::Method.new(**args)
|
|
953
972
|
|
|
954
973
|
# Clone signatures and parameters
|
|
955
974
|
resolved_pin.signatures.each do |sig|
|
|
@@ -987,7 +1006,7 @@ module Solargraph
|
|
|
987
1006
|
end
|
|
988
1007
|
|
|
989
1008
|
# @param namespace_pin [Pin::Namespace, Pin::Constant]
|
|
990
|
-
def has_generics?
|
|
1009
|
+
def has_generics? namespace_pin
|
|
991
1010
|
namespace_pin.is_a?(Pin::Namespace) && !namespace_pin.generics.empty?
|
|
992
1011
|
end
|
|
993
1012
|
|
|
@@ -996,5 +1015,15 @@ module Solargraph
|
|
|
996
1015
|
def can_resolve_generics? namespace_pin, rooted_type
|
|
997
1016
|
has_generics?(namespace_pin) && !rooted_type.all_params.empty?
|
|
998
1017
|
end
|
|
1018
|
+
|
|
1019
|
+
protected
|
|
1020
|
+
|
|
1021
|
+
# @todo need to model type def statement in chains as a symbol so
|
|
1022
|
+
# that this overload of 'protected' will typecheck @sg-ignore
|
|
1023
|
+
# @sg-ignore
|
|
1024
|
+
def equality_fields
|
|
1025
|
+
[self.class, @source_map_hash, conventions_environ, @doc_map, @unresolved_requires, @missing_docs,
|
|
1026
|
+
@loose_unions]
|
|
1027
|
+
end
|
|
999
1028
|
end
|
|
1000
1029
|
end
|
data/lib/solargraph/bench.rb
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# @param
|
|
21
|
-
# @param
|
|
22
|
-
# @param
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
@
|
|
26
|
-
@
|
|
27
|
-
@
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# @return [Hash{String => SourceMap}]
|
|
34
|
-
def source_map_hash
|
|
35
|
-
# @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
|
|
36
|
-
@source_map_hash ||= source_maps.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
# A container of source maps and workspace data to be cataloged in an ApiMap.
|
|
5
|
+
#
|
|
6
|
+
class Bench
|
|
7
|
+
# @return [Set<SourceMap>]
|
|
8
|
+
attr_reader :source_maps
|
|
9
|
+
|
|
10
|
+
# @return [Workspace]
|
|
11
|
+
attr_reader :workspace
|
|
12
|
+
|
|
13
|
+
# @return [SourceMap]
|
|
14
|
+
attr_reader :live_map
|
|
15
|
+
|
|
16
|
+
# @return [Set<String>]
|
|
17
|
+
attr_reader :external_requires
|
|
18
|
+
|
|
19
|
+
# @param source_maps [Array<SourceMap>, Set<SourceMap>]
|
|
20
|
+
# @param workspace [Workspace]
|
|
21
|
+
# @param live_map [SourceMap, nil]
|
|
22
|
+
# @param external_requires [Array<String>, Set<String>]
|
|
23
|
+
def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
|
|
24
|
+
@source_maps = source_maps.to_set
|
|
25
|
+
@workspace = workspace
|
|
26
|
+
@live_map = live_map
|
|
27
|
+
@external_requires = external_requires.reject { |path| workspace.would_require?(path) }
|
|
28
|
+
.compact
|
|
29
|
+
.to_set
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @sg-ignore flow sensitive typing needs better handling of ||= on lvars
|
|
33
|
+
# @return [Hash{String => SourceMap}]
|
|
34
|
+
def source_map_hash
|
|
35
|
+
# @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
|
|
36
|
+
@source_map_hash ||= source_maps.to_h { |s| [s.filename, s] }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [Set<SourceMap>]
|
|
40
|
+
def icebox
|
|
41
|
+
@icebox ||= (source_maps - [live_map])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -43,8 +43,9 @@ module Solargraph
|
|
|
43
43
|
@rooted_tag ||= rooted_name + rooted_substring
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
# Whether this is an RBS interface like _ToAry or Hash::_Key.
|
|
46
47
|
def interface?
|
|
47
|
-
name.start_with?('_')
|
|
48
|
+
name.start_with?('_') || name.include?('::_')
|
|
48
49
|
end
|
|
49
50
|
|
|
50
51
|
# @return [Boolean]
|
|
@@ -54,11 +55,11 @@ module Solargraph
|
|
|
54
55
|
|
|
55
56
|
# @return [Boolean]
|
|
56
57
|
def nil_type?
|
|
57
|
-
@nil_type ||=
|
|
58
|
+
@nil_type ||= name.casecmp('nil').zero?
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
def tuple?
|
|
61
|
-
@
|
|
62
|
+
@tuple ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
def void?
|
|
@@ -87,7 +88,7 @@ module Solargraph
|
|
|
87
88
|
|
|
88
89
|
# @param generics_to_erase [Enumerable<String>]
|
|
89
90
|
# @return [self]
|
|
90
|
-
def erase_generics
|
|
91
|
+
def erase_generics generics_to_erase
|
|
91
92
|
transform do |type|
|
|
92
93
|
if type.name == ComplexType::GENERIC_TAG_NAME
|
|
93
94
|
if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
|
|
@@ -142,7 +143,7 @@ module Solargraph
|
|
|
142
143
|
@namespace ||= lambda do
|
|
143
144
|
return 'Object' if duck_type?
|
|
144
145
|
return 'NilClass' if nil_type?
|
|
145
|
-
|
|
146
|
+
%w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
|
|
146
147
|
end.call
|
|
147
148
|
end
|
|
148
149
|
|
|
@@ -150,7 +151,7 @@ module Solargraph
|
|
|
150
151
|
def namespace_type
|
|
151
152
|
return ComplexType.parse('::Object') if duck_type?
|
|
152
153
|
return ComplexType.parse('::NilClass') if nil_type?
|
|
153
|
-
return subtypes.first if
|
|
154
|
+
return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
|
|
154
155
|
self
|
|
155
156
|
end
|
|
156
157
|
|
|
@@ -177,30 +178,27 @@ module Solargraph
|
|
|
177
178
|
end
|
|
178
179
|
|
|
179
180
|
# @return [String]
|
|
180
|
-
def generate_substring_from
|
|
181
|
+
def generate_substring_from &to_str
|
|
181
182
|
key_types_str = key_types.map(&to_str).join(', ')
|
|
182
183
|
subtypes_str = subtypes.map(&to_str).join(', ')
|
|
183
|
-
if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
|
|
184
|
-
|
|
185
|
-
elsif key_types.empty? && subtypes.empty?
|
|
184
|
+
if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
|
|
185
|
+
(key_types.empty? && subtypes.empty?)
|
|
186
186
|
''
|
|
187
187
|
elsif hash_parameters?
|
|
188
188
|
"{#{key_types_str} => #{subtypes_str}}"
|
|
189
189
|
elsif fixed_parameters?
|
|
190
190
|
"(#{subtypes_str})"
|
|
191
|
+
elsif name == 'Hash'
|
|
192
|
+
"<#{key_types_str}, #{subtypes_str}>"
|
|
191
193
|
else
|
|
192
|
-
|
|
193
|
-
"<#{key_types_str}, #{subtypes_str}>"
|
|
194
|
-
else
|
|
195
|
-
"<#{key_types_str}#{subtypes_str}>"
|
|
196
|
-
end
|
|
194
|
+
"<#{key_types_str}#{subtypes_str}>"
|
|
197
195
|
end
|
|
198
196
|
end
|
|
199
197
|
|
|
200
198
|
# @return [::Symbol] :class or :instance
|
|
201
199
|
def scope
|
|
202
200
|
@scope ||= :instance if duck_type? || nil_type?
|
|
203
|
-
@scope ||=
|
|
201
|
+
@scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
|
|
204
202
|
end
|
|
205
203
|
|
|
206
204
|
# @param other [Object]
|