solargraph 0.58.0 → 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.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,92 +1,122 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module NodeProcessor
6
- class Base
7
- # @return [Parser::AST::Node]
8
- attr_reader :node
9
-
10
- # @return [Region]
11
- attr_reader :region
12
-
13
- # @return [Array<Pin::Base>]
14
- attr_reader :pins
15
-
16
- # @return [Array<Pin::LocalVariable>]
17
- attr_reader :locals
18
-
19
- # @param node [Parser::AST::Node]
20
- # @param region [Region]
21
- # @param pins [Array<Pin::Base>]
22
- # @param locals [Array<Pin::LocalVariable>]
23
- def initialize node, region, pins, locals
24
- @node = node
25
- @region = region
26
- @pins = pins
27
- @locals = locals
28
- @processed_children = false
29
- end
30
-
31
- # Subclasses should override this method to generate new pins.
32
- #
33
- # @return [Boolean] continue processing the next processor of the same node type.
34
- # @return [void] In case there is only one processor registered for the node type, it can be void.
35
- def process
36
- process_children
37
-
38
- true
39
- end
40
-
41
- private
42
-
43
- # @param subregion [Region]
44
- # @return [void]
45
- def process_children subregion = region
46
- return if @processed_children
47
- @processed_children = true
48
- node.children.each do |child|
49
- next unless Parser.is_ast_node?(child)
50
- NodeProcessor.process(child, subregion, pins, locals)
51
- end
52
- end
53
-
54
- # @param node [Parser::AST::Node]
55
- # @return [Solargraph::Location]
56
- def get_node_location(node)
57
- range = Parser.node_range(node)
58
- Location.new(region.filename, range)
59
- end
60
-
61
- # @param node [Parser::AST::Node]
62
- # @return [String, nil]
63
- def comments_for(node)
64
- region.source.comments_for(node)
65
- end
66
-
67
- # @param position [Solargraph::Position]
68
- # @return [Pin::Closure, nil]
69
- def named_path_pin position
70
- pins.select do |pin|
71
- pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)
72
- end.last
73
- end
74
-
75
- # @todo Candidate for deprecation
76
- # @param position [Solargraph::Position]
77
- # @return [Pin::Closure, nil]
78
- def block_pin position
79
- # @todo determine if this can return a Pin::Block
80
- pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
81
- end
82
-
83
- # @todo Candidate for deprecation
84
- # @param position [Solargraph::Position]
85
- # @return [Pin::Closure, nil]
86
- def closure_pin position
87
- pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
88
- end
89
- end
90
- end
91
- end
92
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module NodeProcessor
6
+ class Base
7
+ # @return [Parser::AST::Node]
8
+ attr_reader :node
9
+
10
+ # @return [Region]
11
+ attr_reader :region
12
+
13
+ # @return [Array<Pin::Base>]
14
+ attr_reader :pins
15
+
16
+ # @return [Array<Pin::LocalVariable>]
17
+ attr_reader :locals
18
+
19
+ # @return [Array<Pin::InstanceVariable>]
20
+ attr_reader :ivars
21
+
22
+ # @param node [Parser::AST::Node]
23
+ # @param region [Region]
24
+ # @param pins [Array<Pin::Base>]
25
+ # @param locals [Array<Pin::LocalVariable>]
26
+ # @param ivars [Array<Pin::InstanceVariable>]
27
+ def initialize node, region, pins, locals, ivars
28
+ @node = node
29
+ @region = region
30
+ @pins = pins
31
+ @locals = locals
32
+ @ivars = ivars
33
+ @processed_children = false
34
+ end
35
+
36
+ # Subclasses should override this method to generate new pins.
37
+ #
38
+ # @return [Boolean] continue processing the next processor of the same node type.
39
+ # @return [void] In case there is only one processor registered for the node type, it can be void.
40
+ def process
41
+ process_children
42
+
43
+ true
44
+ end
45
+
46
+ private
47
+
48
+ # @return [Solargraph::Location]
49
+ def location
50
+ get_node_location(node)
51
+ end
52
+
53
+ # @return [Solargraph::Position]
54
+ def position
55
+ Position.new(node.loc.line, node.loc.column)
56
+ end
57
+
58
+ # @sg-ignore downcast output of Enumerable#select
59
+ # @return [Solargraph::Pin::Breakable, nil]
60
+ def enclosing_breakable_pin
61
+ pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
62
+ end
63
+
64
+ # @todo downcast output of Enumerable#select
65
+ # @return [Solargraph::Pin::CompoundStatement, nil]
66
+ def enclosing_compound_statement_pin
67
+ pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
68
+ end
69
+
70
+ # @param subregion [Region]
71
+ # @return [void]
72
+ def process_children subregion = region
73
+ return if @processed_children
74
+ @processed_children = true
75
+ node.children.each do |child|
76
+ next unless Parser.is_ast_node?(child)
77
+ NodeProcessor.process(child, subregion, pins, locals, ivars)
78
+ end
79
+ end
80
+
81
+ # @param node [Parser::AST::Node]
82
+ # @return [Solargraph::Location]
83
+ def get_node_location node
84
+ range = Parser.node_range(node)
85
+ Location.new(region.filename, range)
86
+ end
87
+
88
+ # @param node [Parser::AST::Node]
89
+ # @return [String, nil]
90
+ def comments_for node
91
+ region.source.comments_for(node)
92
+ end
93
+
94
+ # @param position [Solargraph::Position]
95
+ # @return [Pin::Closure, nil]
96
+ def named_path_pin position
97
+ pins.select do |pin|
98
+ # @sg-ignore Need to add nil check here
99
+ pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)
100
+ end.last
101
+ end
102
+
103
+ # @todo Candidate for deprecation
104
+ # @param position [Solargraph::Position]
105
+ # @return [Pin::Closure, nil]
106
+ def block_pin position
107
+ # @todo determine if this can return a Pin::Block
108
+ # @sg-ignore Need to add nil check here
109
+ pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
110
+ end
111
+
112
+ # @todo Candidate for deprecation
113
+ # @param position [Solargraph::Position]
114
+ # @return [Pin::Closure, nil]
115
+ def closure_pin position
116
+ # @sg-ignore Need to add nil check here
117
+ pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -1,62 +1,63 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- # The processor classes used by SourceMap::Mapper to generate pins from
6
- # parser nodes.
7
- #
8
- module NodeProcessor
9
- autoload :Base, 'solargraph/parser/node_processor/base'
10
-
11
- class << self
12
- # @type [Hash{Symbol => Array<Class<NodeProcessor::Base>>}]
13
- @@processors ||= {}
14
-
15
- # Register a processor for a node type. You can register multiple processors for the same type.
16
- # If a node processor returns true, it will skip the next processor of the same node type.
17
- #
18
- # @param type [Symbol]
19
- # @param cls [Class<NodeProcessor::Base>]
20
- # @return [Array<Class<NodeProcessor::Base>>]
21
- def register type, cls
22
- @@processors[type] ||= []
23
- @@processors[type] << cls
24
- end
25
-
26
- # @param type [Symbol]
27
- # @param cls [Class<NodeProcessor::Base>]
28
- #
29
- # @return [void]
30
- def deregister type, cls
31
- @@processors[type].delete(cls)
32
- end
33
- end
34
-
35
- # @param node [Parser::AST::Node]
36
- # @param region [Region]
37
- # @param pins [Array<Pin::Base>]
38
- # @param locals [Array<Pin::BaseVariable>]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
40
- def self.process node, region = Region.new, pins = [], locals = []
41
- if pins.empty?
42
- pins.push Pin::Namespace.new(
43
- location: region.source.location,
44
- name: '',
45
- source: :parser,
46
- )
47
- end
48
- return [pins, locals] unless Parser.is_ast_node?(node)
49
- node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
50
-
51
- node_processor_classes.each do |klass|
52
- processor = klass.new(node, region, pins, locals)
53
- process_next = processor.process
54
-
55
- break unless process_next
56
- end
57
-
58
- [pins, locals]
59
- end
60
- end
61
- end
62
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ # The processor classes used by SourceMap::Mapper to generate pins from
6
+ # parser nodes.
7
+ #
8
+ module NodeProcessor
9
+ autoload :Base, 'solargraph/parser/node_processor/base'
10
+
11
+ class << self
12
+ # @type [Hash{Symbol => Array<Class<NodeProcessor::Base>>}]
13
+ @@processors ||= {}
14
+
15
+ # Register a processor for a node type. You can register multiple processors for the same type.
16
+ # If a node processor returns true, it will skip the next processor of the same node type.
17
+ #
18
+ # @param type [Symbol]
19
+ # @param cls [Class<NodeProcessor::Base>]
20
+ # @return [Array<Class<NodeProcessor::Base>>]
21
+ def register type, cls
22
+ @@processors[type] ||= []
23
+ @@processors[type] << cls
24
+ end
25
+
26
+ # @param type [Symbol]
27
+ # @param cls [Class<NodeProcessor::Base>]
28
+ #
29
+ # @return [void]
30
+ def deregister type, cls
31
+ @@processors[type].delete(cls)
32
+ end
33
+ end
34
+
35
+ # @param node [Parser::AST::Node]
36
+ # @param region [Region]
37
+ # @param pins [Array<Pin::Base>]
38
+ # @param locals [Array<Pin::LocalVariable>]
39
+ # @param ivars [Array<Pin::InstanceVariable>]
40
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>, Array<Pin::InstanceVariable>)]
41
+ def self.process node, region = Region.new, pins = [], locals = [], ivars = []
42
+ if pins.empty?
43
+ pins.push Pin::Namespace.new(
44
+ location: region.source.location,
45
+ name: '',
46
+ source: :parser
47
+ )
48
+ end
49
+ return [pins, locals, ivars] unless Parser.is_ast_node?(node)
50
+ node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
51
+
52
+ node_processor_classes.each do |klass|
53
+ processor = klass.new(node, region, pins, locals, ivars)
54
+ process_next = processor.process
55
+
56
+ break unless process_next
57
+ end
58
+
59
+ [pins, locals, ivars]
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,149 +1,165 @@
1
- # frozen_string_literal: true
2
-
3
- require 'prism'
4
-
5
- module Solargraph
6
- module Parser
7
- module ParserGem
8
- module ClassMethods
9
- # @param code [String]
10
- # @param filename [String, nil]
11
- # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
12
- def parse_with_comments code, filename = nil
13
- node = parse(code, filename)
14
- comments = CommentRipper.new(code, filename, 0).parse
15
- [node, comments]
16
- end
17
-
18
- # @param code [String]
19
- # @param filename [String, nil]
20
- # @param line [Integer]
21
- # @return [Parser::AST::Node]
22
- def parse code, filename = nil, line = 0
23
- buffer = ::Parser::Source::Buffer.new(filename, line)
24
- buffer.source = code
25
- parser.parse(buffer)
26
- rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
27
- raise Parser::SyntaxError, e.message
28
- end
29
-
30
- # @return [::Parser::Base]
31
- def parser
32
- @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
33
- parser.diagnostics.all_errors_are_fatal = true
34
- parser.diagnostics.ignore_warnings = true
35
- end
36
- end
37
-
38
- # @param source [Source]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
40
- def map source
41
- NodeProcessor.process(source.node, Region.new(source: source))
42
- end
43
-
44
- # @param source [Source]
45
- # @param name [String]
46
- # @return [Array<Location>]
47
- def references source, name
48
- if name.end_with?("=")
49
- reg = /#{Regexp.escape name[0..-2]}\s*=/
50
- # @param code [String]
51
- # @param offset [Integer]
52
- # @return [Array(Integer, Integer), Array(nil, nil)]
53
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
54
- else
55
- # @param code [String]
56
- # @param offset [Integer]
57
- # @return [Array(Integer, Integer), Array(nil, nil)]
58
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
59
- end
60
- inner_node_references(name, source.node).map do |n|
61
- rng = Range.from_node(n)
62
- offset = Position.to_offset(source.code, rng.start)
63
- soff, eoff = extract_offset[source.code, offset]
64
- Location.new(
65
- source.filename,
66
- Range.new(
67
- Position.from_offset(source.code, soff),
68
- Position.from_offset(source.code, eoff)
69
- )
70
- )
71
- end
72
- end
73
-
74
- # @param name [String]
75
- # @param top [AST::Node]
76
- # @return [Array<AST::Node>]
77
- def inner_node_references name, top
78
- # @type [Array<AST::Node>]
79
- result = []
80
- if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
81
- result.push top if top.children.any? { |c| c.to_s == name }
82
- top.children.each { |c| result.concat inner_node_references(name, c) }
83
- end
84
- result
85
- end
86
-
87
- # @return [Source::Chain]
88
- def chain *args
89
- NodeChainer.chain *args
90
- end
91
-
92
- # @return [Source::Chain]
93
- def chain_string *args
94
- NodeChainer.load_string *args
95
- end
96
-
97
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
98
- def process_node *args
99
- Solargraph::Parser::NodeProcessor.process *args
100
- end
101
-
102
- # @param node [Parser::AST::Node]
103
- # @return [String, nil]
104
- def infer_literal_node_type node
105
- NodeMethods.infer_literal_node_type node
106
- end
107
-
108
- # @return [Integer]
109
- def version
110
- parser.version
111
- end
112
-
113
- # @param node [BasicObject]
114
- # @return [Boolean]
115
- def is_ast_node? node
116
- node.is_a?(::Parser::AST::Node)
117
- end
118
-
119
- # @param node [Parser::AST::Node]
120
- # @return [Range]
121
- def node_range node
122
- st = Position.new(node.loc.line, node.loc.column)
123
- en = Position.new(node.loc.last_line, node.loc.last_column)
124
- Range.new(st, en)
125
- end
126
-
127
- # @param node [Parser::AST::Node]
128
- # @return [Array<Range>]
129
- def string_ranges node
130
- return [] unless is_ast_node?(node)
131
- result = []
132
- result.push Range.from_node(node) if node.type == :str
133
- node.children.each do |child|
134
- result.concat string_ranges(child)
135
- end
136
- if node.type == :dstr && node.children.last.nil?
137
- last = node.children[-2]
138
- unless last.nil?
139
- rng = Range.from_node(last)
140
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
141
- result.push Range.new(pos, pos)
142
- end
143
- end
144
- result
145
- end
146
- end
147
- end
148
- end
149
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'prism'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module ClassMethods
9
+ # @param code [String]
10
+ # @param filename [String, nil]
11
+ # @param starting_line [Integer] must be provided so that we
12
+ # can find relevant local variables later even if this is just
13
+ # a subset of the file in question
14
+ # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
15
+ def parse_with_comments code, filename = nil, starting_line = 0
16
+ node = parse(code, filename, starting_line)
17
+ comments = CommentRipper.new(code, filename, 0).parse
18
+ [node, comments]
19
+ end
20
+
21
+ # @param code [String]
22
+ # @param filename [String, nil]
23
+ # @param starting_line [Integer]
24
+ # @sg-ignore need to understand that raise does not return
25
+ # @return [Parser::AST::Node]
26
+ def parse code, filename = nil, starting_line = 0
27
+ buffer = ::Parser::Source::Buffer.new(filename, starting_line)
28
+ buffer.source = code
29
+ parser.parse(buffer)
30
+ rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
31
+ raise Parser::SyntaxError, e.message
32
+ end
33
+
34
+ # @return [::Parser::Base]
35
+ def parser
36
+ @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
37
+ parser.diagnostics.all_errors_are_fatal = true
38
+ parser.diagnostics.ignore_warnings = true
39
+ end
40
+ end
41
+
42
+ # @param source [Source]
43
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
44
+ def map source
45
+ # @sg-ignore Need to add nil check here
46
+ pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
47
+ pins.concat(ivars)
48
+ [pins, locals]
49
+ end
50
+
51
+ # @param source [Source]
52
+ # @param name [String]
53
+ # @return [Array<Location>]
54
+ def references source, name
55
+ if name.end_with?('=')
56
+ reg = /#{Regexp.escape name[0..-2]}\s*=/
57
+ # @param code [String]
58
+ # @param offset [Integer]
59
+ # @return [Array(Integer, Integer), Array(nil, nil)]
60
+ # @sg-ignore Need to add nil check here
61
+ extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
62
+ else
63
+ # @param code [String]
64
+ # @param offset [Integer]
65
+ # @return [Array(Integer, Integer), Array(nil, nil)]
66
+ # @sg-ignore Need to add nil check here
67
+ extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
68
+ end
69
+ inner_node_references(name, source.node).map do |n|
70
+ rng = Range.from_node(n)
71
+ # @sg-ignore Need to add nil check here
72
+ offset = Position.to_offset(source.code, rng.start)
73
+ soff, eoff = extract_offset[source.code, offset]
74
+ Location.new(
75
+ source.filename,
76
+ Range.new(
77
+ Position.from_offset(source.code, soff),
78
+ Position.from_offset(source.code, eoff)
79
+ )
80
+ )
81
+ end
82
+ end
83
+
84
+ # @param name [String]
85
+ # @param top [AST::Node]
86
+ # @return [Array<AST::Node>]
87
+ def inner_node_references name, top
88
+ # @type [Array<AST::Node>]
89
+ result = []
90
+ if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
91
+ result.push top if top.children.any? { |c| c.to_s == name }
92
+ top.children.each { |c| result.concat inner_node_references(name, c) }
93
+ end
94
+ result
95
+ end
96
+
97
+ # @return [Source::Chain]
98
+ def chain *args
99
+ NodeChainer.chain(*args)
100
+ end
101
+
102
+ # @return [Source::Chain]
103
+ def chain_string *args
104
+ NodeChainer.load_string(*args)
105
+ end
106
+
107
+ # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
108
+ def process_node *args
109
+ Solargraph::Parser::NodeProcessor.process(*args)
110
+ end
111
+
112
+ # @param node [Parser::AST::Node, nil]
113
+ # @return [String, nil]
114
+ def infer_literal_node_type node
115
+ NodeMethods.infer_literal_node_type node
116
+ end
117
+
118
+ # @return [Integer]
119
+ def version
120
+ parser.version
121
+ end
122
+
123
+ # @param node [BasicObject, nil]
124
+ # @return [Boolean]
125
+ def is_ast_node? node
126
+ node.is_a?(::Parser::AST::Node)
127
+ end
128
+
129
+ # @param node [Parser::AST::Node]
130
+ # @return [Range]
131
+ def node_range node
132
+ st = Position.new(node.loc.line, node.loc.column)
133
+ en = Position.new(node.loc.last_line, node.loc.last_column)
134
+ Range.new(st, en)
135
+ end
136
+
137
+ # @param node [Parser::AST::Node, nil]
138
+ # @return [Array<Range>]
139
+ def string_ranges node
140
+ return [] unless is_ast_node?(node)
141
+ result = []
142
+ # @sg-ignore Translate to something flow sensitive typing understands
143
+ result.push Range.from_node(node) if node.type == :str
144
+ # @sg-ignore Translate to something flow sensitive typing understands
145
+ node.children.each do |child|
146
+ result.concat string_ranges(child)
147
+ end
148
+ # @sg-ignore Translate to something flow sensitive typing understands
149
+ if node.type == :dstr && node.children.last.nil?
150
+ # @sg-ignore Translate to something flow sensitive typing understands
151
+ last = node.children[-2]
152
+ # @sg-ignore Need to add nil check here
153
+ unless last.nil?
154
+ rng = Range.from_node(last)
155
+ # @sg-ignore Need to add nil check here
156
+ pos = Position.new(rng.ending.line, rng.ending.column - 1)
157
+ result.push Range.new(pos, pos)
158
+ end
159
+ end
160
+ result
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end