solargraph 0.58.1 → 0.59.0.dev.1

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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,212 +1,220 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
- require 'solargraph/yard_tags'
5
-
6
- module Solargraph
7
- # An index of Pins and other ApiMap-related data for a single Source
8
- # that can be queried.
9
- #
10
- class SourceMap
11
- autoload :Mapper, 'solargraph/source_map/mapper'
12
- autoload :Clip, 'solargraph/source_map/clip'
13
- autoload :Completion, 'solargraph/source_map/completion'
14
- autoload :Data, 'solargraph/source_map/data'
15
-
16
- # @return [Source]
17
- attr_reader :source
18
-
19
- # @return [Array<Pin::Base>]
20
- def pins
21
- data.pins
22
- end
23
-
24
- # @return [Array<Pin::Base>]
25
- def all_pins
26
- pins + convention_pins
27
- end
28
-
29
- # @return [Array<Pin::LocalVariable>]
30
- def locals
31
- data.locals
32
- end
33
-
34
- # @param source [Source]
35
- def initialize source
36
- @source = source
37
-
38
- conventions_environ.merge Convention.for_local(self) unless filename.nil?
39
- # FIXME: unmemoizing the document_symbols in case it was called and memoized from any of conventions above
40
- # this is to ensure that the convention_pins from all conventions are used in the document_symbols.
41
- # solargraph-rails is known to use this method to get the document symbols. It should probably be removed.
42
- @document_symbols = nil
43
- self.convention_pins = conventions_environ.pins
44
- # @type [Hash{Class<Pin::Base> => Array<Pin::Base>}]
45
- @pin_select_cache = {}
46
- end
47
-
48
- # @generic T
49
- # @param klass [Class<generic<T>>]
50
- #
51
- # @return [Array<generic<T>>]
52
- def pins_by_class klass
53
- @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
54
- end
55
-
56
- # A hash representing the state of the source map's API.
57
- #
58
- # ApiMap#catalog uses this value to determine whether it needs to clear its
59
- # cache.
60
- #
61
- # @return [Integer]
62
- def api_hash
63
- @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
64
- end
65
-
66
- # @return [String]
67
- def filename
68
- source.filename
69
- end
70
-
71
- # @return [String]
72
- def code
73
- source.code
74
- end
75
-
76
- # @return [Array<Pin::Reference::Require>]
77
- def requires
78
- pins_by_class(Pin::Reference::Require)
79
- end
80
-
81
- # @return [Environ]
82
- def conventions_environ
83
- @conventions_environ ||= Environ.new
84
- end
85
-
86
- # all pins except Solargraph::Pin::Reference::Reference
87
- # @return [Array<Pin::Base>]
88
- def document_symbols
89
- @document_symbols ||= (pins + convention_pins).select do |pin|
90
- pin.path && !pin.path.empty?
91
- end
92
- end
93
-
94
- # @param query [String]
95
- # @return [Array<Pin::Base>]
96
- def query_symbols query
97
- Pin::Search.new(document_symbols, query).results
98
- end
99
-
100
- # @param position [Position]
101
- # @return [Source::Cursor]
102
- def cursor_at position
103
- Source::Cursor.new(source, position)
104
- end
105
-
106
- # @param path [String]
107
- # @return [Pin::Base]
108
- def first_pin path
109
- pins.select { |p| p.path == path }.first
110
- end
111
-
112
- # @param location [Solargraph::Location]
113
- # @return [Array<Solargraph::Pin::Base>]
114
- def locate_pins location
115
- # return nil unless location.start_with?("#{filename}:")
116
- (pins + locals).select { |pin| pin.location == location }
117
- end
118
-
119
- # @param line [Integer]
120
- # @param character [Integer]
121
- # @return [Pin::Method,Pin::Namespace]
122
- def locate_named_path_pin line, character
123
- _locate_pin line, character, Pin::Namespace, Pin::Method
124
- end
125
-
126
- # @param line [Integer]
127
- # @param character [Integer]
128
- # @return [Pin::Namespace,Pin::Method,Pin::Block]
129
- def locate_closure_pin line, character
130
- _locate_pin line, character, Pin::Closure
131
- end
132
-
133
- # @deprecated Please use locate_closure_pin instead
134
- alias locate_block_pin locate_closure_pin
135
-
136
- # @param name [String]
137
- # @return [Array<Location>]
138
- def references name
139
- source.references name
140
- end
141
-
142
- # @param location [Location]
143
- # @return [Array<Pin::LocalVariable>]
144
- def locals_at(location)
145
- return [] if location.filename != filename
146
- closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
147
- locals.select { |pin| pin.visible_at?(closure, location) }
148
- end
149
-
150
- class << self
151
- # @param filename [String]
152
- # @return [SourceMap]
153
- def load filename
154
- source = Solargraph::Source.load(filename)
155
- SourceMap.map(source)
156
- end
157
-
158
- # @param code [String]
159
- # @param filename [String, nil]
160
- # @return [SourceMap]
161
- def load_string code, filename = nil
162
- source = Solargraph::Source.load_string(code, filename)
163
- SourceMap.map(source)
164
- end
165
-
166
- # @deprecated
167
- # @param source [Source]
168
- # @return [SourceMap]
169
- def map source
170
- new(source)
171
- end
172
- end
173
-
174
- private
175
-
176
- # @return [Array<Pin::Base>]
177
- attr_writer :convention_pins
178
-
179
- # @return [Hash{Class<Pin::Base> => Array<Pin::Base>}]
180
- def pin_class_hash
181
- @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
182
- end
183
-
184
- # @return [Data]
185
- def data
186
- @data ||= Data.new(source)
187
- end
188
-
189
- # @return [Array<Pin::Base>]
190
- def convention_pins
191
- @convention_pins || []
192
- end
193
-
194
- # @param line [Integer]
195
- # @param character [Integer]
196
- # @param klasses [Array<Class>]
197
- # @return [Pin::Base, nil]
198
- def _locate_pin line, character, *klasses
199
- position = Position.new(line, character)
200
- found = nil
201
- pins.each do |pin|
202
- # @todo Attribute pins should not be treated like closures, but
203
- # there's probably a better way to handle it
204
- next if pin.is_a?(Pin::Method) && pin.attribute?
205
- found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
206
- break if pin.location.range.start.line > line
207
- end
208
- # Assuming the root pin is always valid
209
- found || pins.first
210
- end
211
- end
212
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'yard'
4
+ require 'solargraph/yard_tags'
5
+
6
+ module Solargraph
7
+ # An index of Pins and other ApiMap-related data for a single Source
8
+ # that can be queried.
9
+ #
10
+ class SourceMap
11
+ autoload :Mapper, 'solargraph/source_map/mapper'
12
+ autoload :Clip, 'solargraph/source_map/clip'
13
+ autoload :Completion, 'solargraph/source_map/completion'
14
+ autoload :Data, 'solargraph/source_map/data'
15
+
16
+ # @return [Source]
17
+ attr_reader :source
18
+
19
+ # @return [Array<Pin::Base>]
20
+ def pins
21
+ data.pins
22
+ end
23
+
24
+ # @return [Array<Pin::Base>]
25
+ def all_pins
26
+ pins + convention_pins
27
+ end
28
+
29
+ # @return [Array<Pin::LocalVariable>]
30
+ def locals
31
+ data.locals
32
+ end
33
+
34
+ # @param source [Source]
35
+ def initialize source
36
+ @source = source
37
+ # @type [Array<Pin::Base>, nil]
38
+ @convention_pins = nil
39
+
40
+ conventions_environ.merge Convention.for_local(self) unless filename.nil?
41
+ # FIXME: unmemoizing the document_symbols in case it was called and memoized from any of conventions above
42
+ # this is to ensure that the convention_pins from all conventions are used in the document_symbols.
43
+ # solargraph-rails is known to use this method to get the document symbols. It should probably be removed.
44
+ @document_symbols = nil
45
+ self.convention_pins = conventions_environ.pins
46
+ # @type [Hash{Class<Pin::Base> => Array<Pin::Base>}]
47
+ @pin_select_cache = {}
48
+ end
49
+
50
+ # @generic T
51
+ # @param klass [Class<generic<T>>]
52
+ #
53
+ # @return [Array<generic<T>>]
54
+ def pins_by_class klass
55
+ @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
56
+ end
57
+
58
+ # A hash representing the state of the source map's API.
59
+ #
60
+ # ApiMap#catalog uses this value to determine whether it needs to clear its
61
+ # cache.
62
+ #
63
+ # @return [Integer]
64
+ def api_hash
65
+ @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
66
+ end
67
+
68
+ # @return [String, nil]
69
+ def filename
70
+ source.filename
71
+ end
72
+
73
+ # @return [String]
74
+ def code
75
+ source.code
76
+ end
77
+
78
+ # @return [Array<Pin::Reference::Require>]
79
+ def requires
80
+ pins_by_class(Pin::Reference::Require)
81
+ end
82
+
83
+ # @return [Environ]
84
+ def conventions_environ
85
+ @conventions_environ ||= Environ.new
86
+ end
87
+
88
+ # all pins except Solargraph::Pin::Reference::Reference
89
+ #
90
+ # @return [Array<Pin::Base>]
91
+ def document_symbols
92
+ @document_symbols ||= (pins + convention_pins).select do |pin|
93
+ pin.path && !pin.path.empty?
94
+ end
95
+ end
96
+
97
+ # @param query [String]
98
+ # @return [Array<Pin::Base>]
99
+ def query_symbols query
100
+ Pin::Search.new(document_symbols, query).results
101
+ end
102
+
103
+ # @param position [Position, Array(Integer, Integer)]
104
+ # @return [Source::Cursor]
105
+ def cursor_at position
106
+ Source::Cursor.new(source, position)
107
+ end
108
+
109
+ # @param path [String]
110
+ # @return [Pin::Base]
111
+ def first_pin path
112
+ pins.select { |p| p.path == path }.first
113
+ end
114
+
115
+ # @param location [Solargraph::Location]
116
+ # @return [Array<Solargraph::Pin::Base>]
117
+ def locate_pins location
118
+ # return nil unless location.start_with?("#{filename}:")
119
+ (pins + locals).select { |pin| pin.location == location }
120
+ end
121
+
122
+ # @param line [Integer]
123
+ # @param character [Integer]
124
+ # @return [Pin::Method,Pin::Namespace]
125
+ def locate_named_path_pin line, character
126
+ _locate_pin line, character, Pin::Namespace, Pin::Method
127
+ end
128
+
129
+ # @param line [Integer]
130
+ # @param character [Integer]
131
+ # @return [Pin::Closure]
132
+ def locate_closure_pin line, character
133
+ _locate_pin line, character, Pin::Closure
134
+ end
135
+
136
+ # @deprecated Please use locate_closure_pin instead
137
+ alias locate_block_pin locate_closure_pin
138
+
139
+ # @param name [String]
140
+ # @return [Array<Location>]
141
+ def references name
142
+ source.references name
143
+ end
144
+
145
+ # @param location [Location]
146
+ # @return [Array<Pin::LocalVariable>]
147
+ def locals_at(location)
148
+ return [] if location.filename != filename
149
+ closure = locate_closure_pin(location.range.start.line, location.range.start.character)
150
+ locals.select { |pin| pin.visible_at?(closure, location) }
151
+ end
152
+
153
+ class << self
154
+ # @param filename [String]
155
+ # @return [SourceMap]
156
+ def load filename
157
+ source = Solargraph::Source.load(filename)
158
+ SourceMap.map(source)
159
+ end
160
+
161
+ # @param code [String]
162
+ # @param filename [String, nil]
163
+ # @return [SourceMap]
164
+ def load_string code, filename = nil
165
+ source = Solargraph::Source.load_string(code, filename)
166
+ SourceMap.map(source)
167
+ end
168
+
169
+ # @deprecated
170
+ # @param source [Source]
171
+ # @return [SourceMap]
172
+ def map source
173
+ new(source)
174
+ end
175
+ end
176
+
177
+ private
178
+
179
+ # @return [Array<Pin::Base>]
180
+ attr_writer :convention_pins
181
+
182
+ # @return [Hash{Class<Pin::Base> => Array<Pin::Base>}]
183
+ def pin_class_hash
184
+ # @todo Need to support generic resolution in classify and transform_values
185
+ @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
186
+ end
187
+
188
+ # @return [Data]
189
+ def data
190
+ @data ||= Data.new(source)
191
+ end
192
+
193
+ # @return [Array<Pin::Base>]
194
+ def convention_pins
195
+ @convention_pins || []
196
+ end
197
+
198
+ # @generic T
199
+ # @param line [Integer]
200
+ # @param character [Integer]
201
+ # @param klasses [Array<Class<generic<T>>>]
202
+ # @return [generic<T>, nil]
203
+ # @sg-ignore Need better generic inference here
204
+ def _locate_pin line, character, *klasses
205
+ position = Position.new(line, character)
206
+ found = nil
207
+ pins.each do |pin|
208
+ # @todo Attribute pins should not be treated like closures, but
209
+ # there's probably a better way to handle it
210
+ next if pin.is_a?(Pin::Method) && pin.attribute?
211
+ # @sg-ignore Need to add nil check here
212
+ found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
213
+ # @sg-ignore Need to add nil check here
214
+ break if pin.location.range.start.line > line
215
+ end
216
+ # Assuming the root pin is always valid
217
+ found || pins.first
218
+ end
219
+ end
220
+ end
@@ -1,32 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # A problem reported by TypeChecker.
6
- #
7
- class Problem
8
- # @return [Solargraph::Location]
9
- attr_reader :location
10
-
11
- # @return [String]
12
- attr_reader :message
13
-
14
- # @return [Pin::Base]
15
- attr_reader :pin
16
-
17
- # @return [String, nil]
18
- attr_reader :suggestion
19
-
20
- # @param location [Solargraph::Location]
21
- # @param message [String]
22
- # @param pin [Solargraph::Pin::Base, nil]
23
- # @param suggestion [String, nil]
24
- def initialize location, message, pin: nil, suggestion: nil
25
- @location = location
26
- @message = message
27
- @pin = pin
28
- @suggestion = suggestion
29
- end
30
- end
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # A problem reported by TypeChecker.
6
+ #
7
+ class Problem
8
+ # @todo Missed nil violation
9
+ # @return [Solargraph::Location]
10
+ attr_reader :location
11
+
12
+ # @return [String]
13
+ attr_reader :message
14
+
15
+ # @todo Missed nil violation
16
+ # @return [Pin::Base]
17
+ attr_reader :pin
18
+
19
+ # @return [String, nil]
20
+ attr_reader :suggestion
21
+
22
+ # @param location [Solargraph::Location, nil]
23
+ # @param message [String]
24
+ # @param pin [Solargraph::Pin::Base, nil]
25
+ # @param suggestion [String, nil]
26
+ def initialize location, message, pin: nil, suggestion: nil
27
+ @location = location
28
+ @message = message
29
+ @pin = pin
30
+ @suggestion = suggestion
31
+ end
32
+ end
33
+ end
34
+ end