solargraph 0.54.0 → 0.58.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 +127 -0
- data/.github/workflows/plugins.yml +184 -6
- data/.github/workflows/rspec.yml +55 -5
- data/.github/workflows/typecheck.yml +8 -3
- data/.gitignore +7 -0
- data/.overcommit.yml +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +1279 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +171 -0
- data/README.md +20 -6
- data/Rakefile +125 -13
- data/bin/solargraph +8 -5
- data/lib/solargraph/api_map/cache.rb +13 -3
- data/lib/solargraph/api_map/constants.rb +279 -0
- data/lib/solargraph/api_map/index.rb +193 -0
- data/lib/solargraph/api_map/source_to_yard.rb +13 -4
- data/lib/solargraph/api_map/store.rb +207 -132
- data/lib/solargraph/api_map.rb +394 -261
- data/lib/solargraph/bench.rb +18 -1
- data/lib/solargraph/complex_type/type_methods.rb +29 -12
- data/lib/solargraph/complex_type/unique_type.rb +205 -26
- data/lib/solargraph/complex_type.rb +126 -26
- data/lib/solargraph/convention/active_support_concern.rb +111 -0
- data/lib/solargraph/convention/base.rb +20 -3
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
- data/lib/solargraph/convention/data_definition.rb +105 -0
- data/lib/solargraph/convention/gemspec.rb +3 -2
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
- data/lib/solargraph/convention/struct_definition.rb +164 -0
- data/lib/solargraph/convention.rb +36 -4
- data/lib/solargraph/diagnostics/rubocop.rb +6 -1
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/doc_map.rb +316 -64
- data/lib/solargraph/environ.rb +9 -2
- data/lib/solargraph/equality.rb +34 -0
- data/lib/solargraph/gem_pins.rb +64 -38
- data/lib/solargraph/language_server/host/dispatch.rb +2 -0
- data/lib/solargraph/language_server/host/message_worker.rb +54 -5
- data/lib/solargraph/language_server/host.rb +36 -18
- data/lib/solargraph/language_server/message/base.rb +20 -12
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
- data/lib/solargraph/language_server/message/extended/document.rb +5 -2
- data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
- data/lib/solargraph/language_server/message/initialize.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
- data/lib/solargraph/language_server/message/text_document/definition.rb +5 -3
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
- 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 -2
- data/lib/solargraph/language_server/progress.rb +27 -2
- data/lib/solargraph/language_server/request.rb +4 -1
- data/lib/solargraph/library.rb +83 -73
- data/lib/solargraph/location.rb +45 -1
- data/lib/solargraph/logging.rb +12 -2
- data/lib/solargraph/page.rb +3 -0
- data/lib/solargraph/parser/comment_ripper.rb +20 -7
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
- data/lib/solargraph/parser/node_processor/base.rb +10 -5
- data/lib/solargraph/parser/node_processor.rb +26 -8
- data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +14 -2
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
- data/lib/solargraph/parser/region.rb +4 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +3 -5
- data/lib/solargraph/pin/base.rb +417 -42
- data/lib/solargraph/pin/base_variable.rb +21 -12
- data/lib/solargraph/pin/block.rb +9 -26
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +231 -0
- data/lib/solargraph/pin/closure.rb +30 -10
- data/lib/solargraph/pin/common.rb +12 -7
- data/lib/solargraph/pin/constant.rb +2 -0
- data/lib/solargraph/pin/conversions.rb +3 -2
- data/lib/solargraph/pin/delegated_method.rb +20 -1
- data/lib/solargraph/pin/documenting.rb +16 -0
- data/lib/solargraph/pin/instance_variable.rb +2 -2
- data/lib/solargraph/pin/keyword.rb +7 -2
- data/lib/solargraph/pin/local_variable.rb +15 -7
- data/lib/solargraph/pin/method.rb +241 -70
- data/lib/solargraph/pin/method_alias.rb +3 -0
- data/lib/solargraph/pin/namespace.rb +21 -13
- data/lib/solargraph/pin/parameter.rb +94 -32
- data/lib/solargraph/pin/proxy_type.rb +17 -7
- data/lib/solargraph/pin/reference/override.rb +24 -6
- data/lib/solargraph/pin/reference/require.rb +2 -2
- data/lib/solargraph/pin/reference/superclass.rb +5 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +6 -1
- data/lib/solargraph/pin/signature.rb +39 -121
- data/lib/solargraph/pin/singleton.rb +1 -1
- data/lib/solargraph/pin/symbol.rb +8 -2
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +8 -2
- data/lib/solargraph/pin_cache.rb +245 -0
- data/lib/solargraph/position.rb +19 -0
- data/lib/solargraph/range.rb +23 -4
- data/lib/solargraph/rbs_map/conversions.rb +315 -99
- data/lib/solargraph/rbs_map/core_fills.rb +50 -16
- data/lib/solargraph/rbs_map/core_map.rb +41 -11
- data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
- data/lib/solargraph/rbs_map.rb +87 -16
- data/lib/solargraph/shell.rb +117 -17
- data/lib/solargraph/source/chain/array.rb +13 -8
- data/lib/solargraph/source/chain/block_symbol.rb +1 -1
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +135 -66
- data/lib/solargraph/source/chain/constant.rb +3 -66
- data/lib/solargraph/source/chain/hash.rb +9 -3
- data/lib/solargraph/source/chain/head.rb +1 -1
- data/lib/solargraph/source/chain/if.rb +7 -2
- data/lib/solargraph/source/chain/link.rb +38 -6
- data/lib/solargraph/source/chain/literal.rb +27 -2
- data/lib/solargraph/source/chain/or.rb +2 -2
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +140 -63
- data/lib/solargraph/source/change.rb +2 -2
- data/lib/solargraph/source/cursor.rb +4 -4
- data/lib/solargraph/source/source_chainer.rb +3 -3
- data/lib/solargraph/source.rb +110 -89
- data/lib/solargraph/source_map/clip.rb +22 -28
- data/lib/solargraph/source_map/data.rb +34 -0
- data/lib/solargraph/source_map/mapper.rb +11 -7
- data/lib/solargraph/source_map.rb +50 -43
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker/param_def.rb +2 -0
- data/lib/solargraph/type_checker/rules.rb +35 -8
- data/lib/solargraph/type_checker.rb +331 -189
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/_method.erb +10 -10
- data/lib/solargraph/views/_namespace.erb +3 -3
- data/lib/solargraph/views/document.erb +10 -10
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +25 -5
- data/lib/solargraph/workspace/require_paths.rb +97 -0
- data/lib/solargraph/workspace.rb +53 -72
- data/lib/solargraph/yard_map/helpers.rb +29 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
- data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
- data/lib/solargraph/yard_map/mapper.rb +5 -3
- data/lib/solargraph/yard_map/to_method.rb +6 -3
- data/lib/solargraph/yardoc.rb +45 -10
- data/lib/solargraph.rb +35 -1
- data/rbs/fills/bundler/0/bundler.rbs +4271 -0
- data/rbs/fills/open3/0/open3.rbs +172 -0
- data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
- data/rbs/fills/rubygems/0/errors.rbs +364 -0
- data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
- data/rbs/fills/rubygems/0/specification.rbs +1753 -0
- data/rbs/fills/tuple/tuple.rbs +149 -0
- data/rbs_collection.yaml +19 -0
- data/sig/shims/ast/0/node.rbs +5 -0
- data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
- data/sig/shims/ast/2.4/ast.rbs +73 -0
- data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
- data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
- data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
- data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
- data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
- data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
- data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
- data/solargraph.gemspec +32 -10
- metadata +237 -37
- data/lib/.rubocop.yml +0 -22
- data/lib/solargraph/cache.rb +0 -77
- data/lib/solargraph/parser/node_methods.rb +0 -83
|
@@ -1,23 +1,66 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
module Solargraph
|
|
5
4
|
class ApiMap
|
|
5
|
+
# Queryable collection of Pins representing a Workspace, gems and the Ruby
|
|
6
|
+
# core.
|
|
7
|
+
#
|
|
6
8
|
class Store
|
|
9
|
+
# @param pinsets [Array<Enumerable<Pin::Base>>]
|
|
10
|
+
def initialize *pinsets
|
|
11
|
+
@pinsets = pinsets
|
|
12
|
+
catalog pinsets
|
|
13
|
+
end
|
|
14
|
+
|
|
7
15
|
# @return [Array<Solargraph::Pin::Base>]
|
|
8
|
-
|
|
16
|
+
def pins
|
|
17
|
+
index.pins
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @param pinsets [Array<Array<Pin::Base>>]
|
|
21
|
+
# - pinsets[0] = core Ruby pins
|
|
22
|
+
# - pinsets[1] = documentation/gem pins
|
|
23
|
+
# - pinsets[2] = convention pins
|
|
24
|
+
# - pinsets[3] = workspace source pins
|
|
25
|
+
# - pinsets[4] = currently open file pins
|
|
26
|
+
# @return [Boolean] True if the index was updated
|
|
27
|
+
def update *pinsets
|
|
28
|
+
return catalog(pinsets) if pinsets.length != @pinsets.length
|
|
29
|
+
|
|
30
|
+
changed = pinsets.find_index.with_index { |pinset, idx| @pinsets[idx] != pinset }
|
|
31
|
+
return false unless changed
|
|
32
|
+
|
|
33
|
+
# @todo Fix this map
|
|
34
|
+
@fqns_pins_map = nil
|
|
35
|
+
return catalog(pinsets) if changed == 0
|
|
36
|
+
|
|
37
|
+
pinsets[changed..].each_with_index do |pins, idx|
|
|
38
|
+
@pinsets[changed + idx] = pins
|
|
39
|
+
@indexes[changed + idx] = if pins.empty?
|
|
40
|
+
@indexes[changed + idx - 1]
|
|
41
|
+
else
|
|
42
|
+
@indexes[changed + idx - 1].merge(pins)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
constants.clear
|
|
46
|
+
cached_qualify_superclass.clear
|
|
47
|
+
true
|
|
48
|
+
end
|
|
9
49
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
50
|
+
def to_s
|
|
51
|
+
self.class.to_s
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def inspect
|
|
55
|
+
to_s
|
|
14
56
|
end
|
|
15
57
|
|
|
16
58
|
# @param fqns [String]
|
|
17
59
|
# @param visibility [Array<Symbol>]
|
|
18
|
-
# @return [Enumerable<Solargraph::Pin::
|
|
60
|
+
# @return [Enumerable<Solargraph::Pin::Namespace, Solargraph::Pin::Constant>]
|
|
19
61
|
def get_constants fqns, visibility = [:public]
|
|
20
62
|
namespace_children(fqns).select { |pin|
|
|
63
|
+
# @sg-ignore flow-sensitive typing not smart enough to handle this case
|
|
21
64
|
!pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
|
|
22
65
|
}
|
|
23
66
|
end
|
|
@@ -27,34 +70,52 @@ module Solargraph
|
|
|
27
70
|
# @param visibility [Array<Symbol>]
|
|
28
71
|
# @return [Enumerable<Solargraph::Pin::Method>]
|
|
29
72
|
def get_methods fqns, scope: :instance, visibility: [:public]
|
|
30
|
-
namespace_children(fqns).select do |pin|
|
|
73
|
+
all_pins = namespace_children(fqns).select do |pin|
|
|
74
|
+
# @sg-ignore https://github.com/castwide/solargraph/pull/1114
|
|
31
75
|
pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
|
|
32
76
|
end
|
|
77
|
+
GemPins.combine_method_pins_by_path(all_pins)
|
|
33
78
|
end
|
|
34
79
|
|
|
80
|
+
BOOLEAN_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Boolean', closure: Pin::ROOT_PIN, source: :solargraph)
|
|
81
|
+
OBJECT_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Object', closure: Pin::ROOT_PIN, source: :solargraph)
|
|
82
|
+
|
|
35
83
|
# @param fqns [String]
|
|
36
|
-
# @return [
|
|
84
|
+
# @return [Pin::Reference::Superclass]
|
|
37
85
|
def get_superclass fqns
|
|
38
|
-
return
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
|
|
86
|
+
return nil if fqns.nil? || fqns.empty?
|
|
87
|
+
return BOOLEAN_SUPERCLASS_PIN if %w[TrueClass FalseClass].include?(fqns)
|
|
88
|
+
|
|
89
|
+
superclass_references[fqns].first || try_special_superclasses(fqns)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @param fq_sub_tag [String]
|
|
93
|
+
# @return [String, nil]
|
|
94
|
+
def qualify_superclass fq_sub_tag
|
|
95
|
+
cached_qualify_superclass[fq_sub_tag] || qualify_and_cache_superclass(fq_sub_tag)
|
|
96
|
+
type = ComplexType.try_parse(fq_sub_tag)
|
|
97
|
+
return type.simplify_literals.to_s if type.literal?
|
|
98
|
+
ref = get_superclass(fq_sub_tag)
|
|
99
|
+
return unless ref
|
|
100
|
+
res = constants.dereference(ref)
|
|
101
|
+
return unless res
|
|
102
|
+
res
|
|
42
103
|
end
|
|
43
104
|
|
|
44
105
|
# @param fqns [String]
|
|
45
|
-
# @return [Array<
|
|
106
|
+
# @return [Array<Pin::Reference::Include>]
|
|
46
107
|
def get_includes fqns
|
|
47
108
|
include_references[fqns] || []
|
|
48
109
|
end
|
|
49
110
|
|
|
50
111
|
# @param fqns [String]
|
|
51
|
-
# @return [Array<
|
|
112
|
+
# @return [Array<Pin::Reference::Prepend>]
|
|
52
113
|
def get_prepends fqns
|
|
53
114
|
prepend_references[fqns] || []
|
|
54
115
|
end
|
|
55
116
|
|
|
56
117
|
# @param fqns [String]
|
|
57
|
-
# @return [Array<
|
|
118
|
+
# @return [Array<Pin::Reference::Extend>]
|
|
58
119
|
def get_extends fqns
|
|
59
120
|
extend_references[fqns] || []
|
|
60
121
|
end
|
|
@@ -62,11 +123,7 @@ module Solargraph
|
|
|
62
123
|
# @param path [String]
|
|
63
124
|
# @return [Array<Solargraph::Pin::Base>]
|
|
64
125
|
def get_path_pins path
|
|
65
|
-
path_pin_hash[path]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def cacheable_pins
|
|
69
|
-
@cacheable_pins ||= pins_by_class(Pin::Namespace) + pins_by_class(Pin::Constant) + pins_by_class(Pin::Method) + pins_by_class(Pin::Reference)
|
|
126
|
+
index.path_pin_hash[path]
|
|
70
127
|
end
|
|
71
128
|
|
|
72
129
|
# @param fqns [String]
|
|
@@ -79,9 +136,10 @@ module Solargraph
|
|
|
79
136
|
end
|
|
80
137
|
|
|
81
138
|
# @param fqns [String]
|
|
82
|
-
#
|
|
139
|
+
#
|
|
140
|
+
# @return [Enumerable<Solargraph::Pin::ClassVariable>]
|
|
83
141
|
def get_class_variables(fqns)
|
|
84
|
-
namespace_children(fqns).select{|pin| pin.is_a?(Pin::ClassVariable)}
|
|
142
|
+
namespace_children(fqns).select { |pin| pin.is_a?(Pin::ClassVariable)}
|
|
85
143
|
end
|
|
86
144
|
|
|
87
145
|
# @return [Enumerable<Solargraph::Pin::Base>]
|
|
@@ -95,12 +153,7 @@ module Solargraph
|
|
|
95
153
|
fqns_pins(fqns).any?
|
|
96
154
|
end
|
|
97
155
|
|
|
98
|
-
# @return [
|
|
99
|
-
def namespaces
|
|
100
|
-
@namespaces ||= Set.new
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# @return [Array<Solargraph::Pin::Base>]
|
|
156
|
+
# @return [Enumerable<Solargraph::Pin::Namespace>]
|
|
104
157
|
def namespace_pins
|
|
105
158
|
pins_by_class(Solargraph::Pin::Namespace)
|
|
106
159
|
end
|
|
@@ -139,18 +192,11 @@ module Solargraph
|
|
|
139
192
|
pins_by_class(Pin::Block)
|
|
140
193
|
end
|
|
141
194
|
|
|
142
|
-
def inspect
|
|
143
|
-
# Avoid insane dumps in specs
|
|
144
|
-
to_s
|
|
145
|
-
end
|
|
146
|
-
|
|
147
195
|
# @generic T
|
|
148
|
-
# @param klass [Class<T
|
|
149
|
-
# @return [
|
|
196
|
+
# @param klass [Class<generic<T>>]
|
|
197
|
+
# @return [Set<generic<T>>]
|
|
150
198
|
def pins_by_class klass
|
|
151
|
-
|
|
152
|
-
s = Set.new
|
|
153
|
-
@pin_select_cache[klass] ||= @pin_class_hash.each_with_object(s) { |(key, o), n| n.merge(o) if key <= klass }
|
|
199
|
+
index.pins_by_class klass
|
|
154
200
|
end
|
|
155
201
|
|
|
156
202
|
# @param fqns [String]
|
|
@@ -168,10 +214,89 @@ module Solargraph
|
|
|
168
214
|
fqns_pins_map[[base, name]]
|
|
169
215
|
end
|
|
170
216
|
|
|
217
|
+
# Get all ancestors (superclasses, includes, prepends, extends) for a namespace
|
|
218
|
+
# @param fqns [String] The fully qualified namespace
|
|
219
|
+
# @return [Array<String>] Array of ancestor namespaces including the original
|
|
220
|
+
def get_ancestors(fqns)
|
|
221
|
+
return [] if fqns.nil? || fqns.empty?
|
|
222
|
+
|
|
223
|
+
ancestors = [fqns]
|
|
224
|
+
visited = Set.new
|
|
225
|
+
queue = [fqns]
|
|
226
|
+
|
|
227
|
+
until queue.empty?
|
|
228
|
+
current = queue.shift
|
|
229
|
+
next if current.nil? || current.empty? || visited.include?(current)
|
|
230
|
+
visited.add(current)
|
|
231
|
+
|
|
232
|
+
current = current.gsub(/^::/, '')
|
|
233
|
+
|
|
234
|
+
# Add superclass
|
|
235
|
+
ref = get_superclass(current)
|
|
236
|
+
superclass = ref && constants.dereference(ref)
|
|
237
|
+
if superclass && !superclass.empty? && !visited.include?(superclass)
|
|
238
|
+
ancestors << superclass
|
|
239
|
+
queue << superclass
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Add includes, prepends, and extends
|
|
243
|
+
[get_includes(current), get_prepends(current), get_extends(current)].each do |refs|
|
|
244
|
+
next if refs.nil?
|
|
245
|
+
# @param ref [String]
|
|
246
|
+
refs.map(&:type).map(&:to_s).each do |ref|
|
|
247
|
+
next if ref.nil? || ref.empty? || visited.include?(ref)
|
|
248
|
+
ancestors << ref
|
|
249
|
+
queue << ref
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
ancestors.compact.uniq
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# @param fqns [String]
|
|
258
|
+
#
|
|
259
|
+
# @return [Array<Solargraph::Pin::Reference>]
|
|
260
|
+
def get_ancestor_references(fqns)
|
|
261
|
+
(get_prepends(fqns) + get_includes(fqns) + [get_superclass(fqns)]).compact
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# @return [Constants]
|
|
265
|
+
def constants
|
|
266
|
+
@constants ||= Constants.new(self)
|
|
267
|
+
end
|
|
268
|
+
|
|
171
269
|
private
|
|
172
270
|
|
|
271
|
+
# @return [Index]
|
|
272
|
+
def index
|
|
273
|
+
@indexes.last
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# @param pinsets [Array<Array<Pin::Base>>]
|
|
277
|
+
#
|
|
278
|
+
# @return [void]
|
|
279
|
+
def catalog pinsets
|
|
280
|
+
@pinsets = pinsets
|
|
281
|
+
# @type [Array<Index>]
|
|
282
|
+
@indexes = []
|
|
283
|
+
pinsets.each do |pins|
|
|
284
|
+
if @indexes.last && pins.empty?
|
|
285
|
+
@indexes.push @indexes.last
|
|
286
|
+
else
|
|
287
|
+
@indexes.push(@indexes.last&.merge(pins) || Solargraph::ApiMap::Index.new(pins))
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
constants.clear
|
|
291
|
+
cached_qualify_superclass.clear
|
|
292
|
+
true
|
|
293
|
+
end
|
|
294
|
+
|
|
173
295
|
# @return [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
|
|
174
296
|
def fqns_pins_map
|
|
297
|
+
# @param h [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
|
|
298
|
+
# @param base [String]
|
|
299
|
+
# @param name [String]
|
|
175
300
|
@fqns_pins_map ||= Hash.new do |h, (base, name)|
|
|
176
301
|
value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
|
|
177
302
|
h[[base, name]] = value
|
|
@@ -180,129 +305,79 @@ module Solargraph
|
|
|
180
305
|
|
|
181
306
|
# @return [Enumerable<Solargraph::Pin::Symbol>]
|
|
182
307
|
def symbols
|
|
183
|
-
pins_by_class(Pin::Symbol)
|
|
308
|
+
index.pins_by_class(Pin::Symbol)
|
|
184
309
|
end
|
|
185
310
|
|
|
186
311
|
# @return [Hash{String => Array<String>}]
|
|
187
312
|
def superclass_references
|
|
188
|
-
|
|
313
|
+
index.superclass_references
|
|
189
314
|
end
|
|
190
315
|
|
|
191
|
-
# @return [Hash{String => Array<
|
|
316
|
+
# @return [Hash{String => Array<Pin::Reference::Include>}]
|
|
192
317
|
def include_references
|
|
193
|
-
|
|
318
|
+
index.include_references
|
|
194
319
|
end
|
|
195
320
|
|
|
196
|
-
# @return [Hash{String => Array<
|
|
321
|
+
# @return [Hash{String => Array<Solargraph::Pin::Reference::Include>}]
|
|
322
|
+
def include_reference_pins
|
|
323
|
+
index.include_reference_pins
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# @return [Hash{String => Array<Pin::Reference::Prepend>}]
|
|
197
327
|
def prepend_references
|
|
198
|
-
|
|
328
|
+
index.prepend_references
|
|
199
329
|
end
|
|
200
330
|
|
|
201
|
-
# @return [Hash{String => Array<
|
|
331
|
+
# @return [Hash{String => Array<Pin::Reference::Extend>}]
|
|
202
332
|
def extend_references
|
|
203
|
-
|
|
333
|
+
index.extend_references
|
|
204
334
|
end
|
|
205
335
|
|
|
206
336
|
# @param name [String]
|
|
207
337
|
# @return [Enumerable<Solargraph::Pin::Base>]
|
|
208
338
|
def namespace_children name
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
# @return [Hash{String => Enumerable<Pin::Base>}
|
|
213
|
-
def namespace_map
|
|
214
|
-
@namespace_map ||= {}
|
|
339
|
+
return [] unless index.namespace_hash.key?(name)
|
|
340
|
+
index.namespace_hash[name]
|
|
215
341
|
end
|
|
216
342
|
|
|
217
343
|
# @return [Enumerable<Pin::InstanceVariable>]
|
|
218
344
|
def all_instance_variables
|
|
219
|
-
pins_by_class(Pin::InstanceVariable)
|
|
345
|
+
index.pins_by_class(Pin::InstanceVariable)
|
|
220
346
|
end
|
|
221
347
|
|
|
222
|
-
# @
|
|
223
|
-
|
|
224
|
-
|
|
348
|
+
# @param fqns [String]
|
|
349
|
+
# @return [Pin::Reference::Superclass, nil]
|
|
350
|
+
def try_special_superclasses(fqns)
|
|
351
|
+
return OBJECT_SUPERCLASS_PIN if fqns == 'Boolean'
|
|
352
|
+
return OBJECT_SUPERCLASS_PIN if !%w[BasicObject Object].include?(fqns) && namespace_exists?(fqns)
|
|
353
|
+
|
|
354
|
+
sub = ComplexType.try_parse(fqns)
|
|
355
|
+
return get_superclass(sub.simplify_literals.name) if sub.literal?
|
|
356
|
+
|
|
357
|
+
get_superclass(sub.namespace) if sub.namespace != fqns
|
|
225
358
|
end
|
|
226
359
|
|
|
227
|
-
#
|
|
228
|
-
#
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
#
|
|
232
|
-
# @return [void]
|
|
233
|
-
def store_parametric_reference(h, reference_pin)
|
|
234
|
-
referenced_ns = reference_pin.name
|
|
235
|
-
referenced_tag_params = reference_pin.generic_values
|
|
236
|
-
referenced_tag = referenced_ns +
|
|
237
|
-
if referenced_tag_params && referenced_tag_params.length > 0
|
|
238
|
-
"<" + referenced_tag_params.join(', ') + ">"
|
|
239
|
-
else
|
|
240
|
-
''
|
|
241
|
-
end
|
|
242
|
-
referencing_ns = reference_pin.namespace
|
|
243
|
-
h[referencing_ns] ||= []
|
|
244
|
-
h[referencing_ns].push referenced_tag
|
|
360
|
+
# @param fq_sub_tag [String]
|
|
361
|
+
# @return [String, nil]
|
|
362
|
+
def qualify_and_cache_superclass fq_sub_tag
|
|
363
|
+
cached_qualify_superclass[fq_sub_tag] = uncached_qualify_superclass(fq_sub_tag)
|
|
245
364
|
end
|
|
246
365
|
|
|
247
|
-
# @return [
|
|
248
|
-
def
|
|
249
|
-
|
|
250
|
-
@pin_class_hash = set.classify(&:class).transform_values(&:to_a)
|
|
251
|
-
# @type [Hash{Class => ::Array<Solargraph::Pin::Base>}]
|
|
252
|
-
@pin_select_cache = {}
|
|
253
|
-
@namespace_map = set.classify(&:namespace)
|
|
254
|
-
@path_pin_hash = set.classify(&:path)
|
|
255
|
-
@namespaces = @path_pin_hash.keys.compact.to_set
|
|
256
|
-
pins_by_class(Pin::Reference::Include).each do |pin|
|
|
257
|
-
store_parametric_reference(include_references, pin)
|
|
258
|
-
end
|
|
259
|
-
# @todo move the rest of these reference pins over to use
|
|
260
|
-
# generic types, adding rbs_map/conversions.rb code to
|
|
261
|
-
# populate type parameters and adding related specs ensuring
|
|
262
|
-
# the generics get resolved, along with any api_map.rb
|
|
263
|
-
# changes needed in
|
|
264
|
-
pins_by_class(Pin::Reference::Prepend).each do |pin|
|
|
265
|
-
prepend_references[pin.namespace] ||= []
|
|
266
|
-
prepend_references[pin.namespace].push pin.name
|
|
267
|
-
end
|
|
268
|
-
pins_by_class(Pin::Reference::Extend).each do |pin|
|
|
269
|
-
extend_references[pin.namespace] ||= []
|
|
270
|
-
extend_references[pin.namespace].push pin.name
|
|
271
|
-
end
|
|
272
|
-
pins_by_class(Pin::Reference::Superclass).each do |pin|
|
|
273
|
-
superclass_references[pin.namespace] ||= []
|
|
274
|
-
superclass_references[pin.namespace].push pin.name
|
|
275
|
-
end
|
|
276
|
-
pins_by_class(Pin::Reference::Override).each do |ovr|
|
|
277
|
-
pin = get_path_pins(ovr.name).first
|
|
278
|
-
next if pin.nil?
|
|
279
|
-
new_pin = if pin.path.end_with?('#initialize')
|
|
280
|
-
get_path_pins(pin.path.sub(/#initialize/, '.new')).first
|
|
281
|
-
end
|
|
282
|
-
(ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
|
|
283
|
-
pin.docstring.delete_tags tag.to_sym
|
|
284
|
-
new_pin.docstring.delete_tags tag.to_sym if new_pin
|
|
285
|
-
end
|
|
286
|
-
ovr.tags.each do |tag|
|
|
287
|
-
pin.docstring.add_tag(tag)
|
|
288
|
-
redefine_return_type pin, tag
|
|
289
|
-
if new_pin
|
|
290
|
-
new_pin.docstring.add_tag(tag)
|
|
291
|
-
redefine_return_type new_pin, tag
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
end
|
|
366
|
+
# @return [Hash{String => String, nil}]
|
|
367
|
+
def cached_qualify_superclass
|
|
368
|
+
@cached_qualify_superclass ||= {}
|
|
295
369
|
end
|
|
296
370
|
|
|
297
|
-
# @param
|
|
298
|
-
# @
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
return
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
371
|
+
# @param fq_sub_tag [String]
|
|
372
|
+
# @return [String, nil]
|
|
373
|
+
def uncached_qualify_superclass fq_sub_tag
|
|
374
|
+
type = ComplexType.try_parse(fq_sub_tag)
|
|
375
|
+
return type.simplify_literals.to_s if type.literal?
|
|
376
|
+
ref = get_superclass(fq_sub_tag)
|
|
377
|
+
return unless ref
|
|
378
|
+
res = constants.dereference(ref)
|
|
379
|
+
return unless res
|
|
380
|
+
res + type.substring
|
|
306
381
|
end
|
|
307
382
|
end
|
|
308
383
|
end
|