solargraph 0.57.0 → 0.58.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +4 -2
  4. data/.github/workflows/plugins.yml +63 -28
  5. data/.github/workflows/rspec.yml +19 -4
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +1 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +90 -1438
  10. data/CHANGELOG.md +39 -0
  11. data/Rakefile +1 -1
  12. data/bin/solargraph +3 -0
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +279 -218
  15. data/lib/solargraph/api_map/index.rb +193 -169
  16. data/lib/solargraph/api_map/source_to_yard.rb +97 -94
  17. data/lib/solargraph/api_map/store.rb +384 -374
  18. data/lib/solargraph/api_map.rb +945 -951
  19. data/lib/solargraph/bench.rb +45 -45
  20. data/lib/solargraph/complex_type/type_methods.rb +228 -223
  21. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  22. data/lib/solargraph/complex_type.rb +444 -427
  23. data/lib/solargraph/convention/active_support_concern.rb +1 -1
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  26. data/lib/solargraph/convention/data_definition.rb +105 -105
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  32. data/lib/solargraph/convention/struct_definition.rb +164 -164
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +17 -17
  35. data/lib/solargraph/converters/dl.rb +15 -15
  36. data/lib/solargraph/converters/dt.rb +15 -15
  37. data/lib/solargraph/converters/misc.rb +1 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  39. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  41. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  43. data/lib/solargraph/doc_map.rb +439 -436
  44. data/lib/solargraph/environ.rb +1 -1
  45. data/lib/solargraph/equality.rb +34 -33
  46. data/lib/solargraph/gem_pins.rb +98 -94
  47. data/lib/solargraph/language_server/error_codes.rb +20 -20
  48. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  49. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  50. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  51. data/lib/solargraph/language_server/host/sources.rb +99 -99
  52. data/lib/solargraph/language_server/host.rb +878 -872
  53. data/lib/solargraph/language_server/message/base.rb +97 -97
  54. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  55. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  56. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  57. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  58. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  59. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  60. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  61. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  64. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  65. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  66. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -145
  67. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  68. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  69. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  71. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  72. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  73. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  74. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  75. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  76. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  77. data/lib/solargraph/language_server/message.rb +94 -94
  78. data/lib/solargraph/language_server/progress.rb +1 -1
  79. data/lib/solargraph/language_server/request.rb +27 -25
  80. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  81. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  82. data/lib/solargraph/library.rb +683 -683
  83. data/lib/solargraph/location.rb +82 -81
  84. data/lib/solargraph/logging.rb +37 -37
  85. data/lib/solargraph/page.rb +92 -93
  86. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  87. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  88. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  89. data/lib/solargraph/parser/node_processor.rb +62 -62
  90. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  91. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  92. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  93. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -499
  94. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  95. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  96. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  97. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  98. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  99. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  100. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  101. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  102. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  103. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  104. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -42
  105. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  106. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  107. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  108. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -292
  109. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  112. data/lib/solargraph/parser/parser_gem.rb +12 -12
  113. data/lib/solargraph/parser/region.rb +69 -69
  114. data/lib/solargraph/parser/snippet.rb +17 -17
  115. data/lib/solargraph/parser.rb +23 -23
  116. data/lib/solargraph/pin/base.rb +729 -708
  117. data/lib/solargraph/pin/base_variable.rb +126 -124
  118. data/lib/solargraph/pin/block.rb +104 -103
  119. data/lib/solargraph/pin/breakable.rb +9 -9
  120. data/lib/solargraph/pin/callable.rb +231 -227
  121. data/lib/solargraph/pin/closure.rb +72 -76
  122. data/lib/solargraph/pin/common.rb +79 -79
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +123 -123
  125. data/lib/solargraph/pin/delegated_method.rb +120 -121
  126. data/lib/solargraph/pin/documenting.rb +114 -114
  127. data/lib/solargraph/pin/instance_variable.rb +34 -34
  128. data/lib/solargraph/pin/keyword.rb +20 -20
  129. data/lib/solargraph/pin/local_variable.rb +75 -79
  130. data/lib/solargraph/pin/method.rb +672 -656
  131. data/lib/solargraph/pin/method_alias.rb +34 -34
  132. data/lib/solargraph/pin/namespace.rb +115 -115
  133. data/lib/solargraph/pin/parameter.rb +275 -271
  134. data/lib/solargraph/pin/proxy_type.rb +39 -36
  135. data/lib/solargraph/pin/reference/override.rb +47 -47
  136. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  137. data/lib/solargraph/pin/reference.rb +39 -48
  138. data/lib/solargraph/pin/search.rb +61 -58
  139. data/lib/solargraph/pin/signature.rb +61 -61
  140. data/lib/solargraph/pin/symbol.rb +53 -53
  141. data/lib/solargraph/pin/until.rb +18 -18
  142. data/lib/solargraph/pin/while.rb +18 -18
  143. data/lib/solargraph/pin.rb +44 -44
  144. data/lib/solargraph/pin_cache.rb +245 -245
  145. data/lib/solargraph/position.rb +132 -118
  146. data/lib/solargraph/range.rb +112 -108
  147. data/lib/solargraph/rbs_map/conversions.rb +823 -802
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -66
  149. data/lib/solargraph/rbs_map/core_map.rb +58 -54
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  151. data/lib/solargraph/rbs_map.rb +163 -163
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +363 -271
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +337 -333
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +26 -89
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +34 -34
  160. data/lib/solargraph/source/chain/if.rb +28 -28
  161. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +48 -48
  164. data/lib/solargraph/source/chain/or.rb +23 -23
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +291 -289
  169. data/lib/solargraph/source/change.rb +82 -82
  170. data/lib/solargraph/source/cursor.rb +166 -166
  171. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  172. data/lib/solargraph/source/source_chainer.rb +194 -194
  173. data/lib/solargraph/source/updater.rb +55 -55
  174. data/lib/solargraph/source.rb +498 -498
  175. data/lib/solargraph/source_map/clip.rb +226 -234
  176. data/lib/solargraph/source_map/data.rb +34 -34
  177. data/lib/solargraph/source_map/mapper.rb +259 -261
  178. data/lib/solargraph/source_map.rb +212 -207
  179. data/lib/solargraph/type_checker/checks.rb +124 -124
  180. data/lib/solargraph/type_checker/param_def.rb +37 -37
  181. data/lib/solargraph/type_checker/problem.rb +32 -32
  182. data/lib/solargraph/type_checker/rules.rb +84 -70
  183. data/lib/solargraph/type_checker.rb +814 -752
  184. data/lib/solargraph/version.rb +5 -5
  185. data/lib/solargraph/workspace/config.rb +255 -237
  186. data/lib/solargraph/workspace/require_paths.rb +97 -98
  187. data/lib/solargraph/workspace.rb +220 -225
  188. data/lib/solargraph/yard_map/helpers.rb +44 -44
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -129
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  191. data/lib/solargraph/yard_map/mapper.rb +79 -79
  192. data/lib/solargraph/yard_map/to_method.rb +89 -88
  193. data/lib/solargraph/yard_tags.rb +20 -20
  194. data/lib/solargraph/yardoc.rb +87 -64
  195. data/lib/solargraph.rb +105 -105
  196. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  197. data/rbs/fills/open3/0/open3.rbs +172 -0
  198. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  199. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  200. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  201. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  204. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  205. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  206. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  207. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  208. data/rbs_collection.yaml +4 -4
  209. data/solargraph.gemspec +15 -4
  210. metadata +71 -16
  211. data/lib/solargraph/parser/node_methods.rb +0 -97
  212. /data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  215. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  216. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,92 +1,92 @@
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
+ # @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,62 +1,62 @@
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::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,159 +1,149 @@
1
- # frozen_string_literal: true
2
-
3
- require 'prism'
4
-
5
- # Awaiting ability to use a version containing https://github.com/whitequark/parser/pull/1076
6
- #
7
- # @!parse
8
- # class ::Parser::Base < ::Parser::Builder
9
- # # @return [Integer]
10
- # def version; end
11
- # end
12
- # class ::Parser::CurrentRuby < ::Parser::Base; end
13
-
14
- module Solargraph
15
- module Parser
16
- module ParserGem
17
- module ClassMethods
18
- # @param code [String]
19
- # @param filename [String, nil]
20
- # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
21
- def parse_with_comments code, filename = nil
22
- node = parse(code, filename)
23
- comments = CommentRipper.new(code, filename, 0).parse
24
- [node, comments]
25
- end
26
-
27
- # @param code [String]
28
- # @param filename [String, nil]
29
- # @param line [Integer]
30
- # @return [Parser::AST::Node]
31
- def parse code, filename = nil, line = 0
32
- buffer = ::Parser::Source::Buffer.new(filename, line)
33
- buffer.source = code
34
- parser.parse(buffer)
35
- rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
36
- raise Parser::SyntaxError, e.message
37
- end
38
-
39
- # @return [::Parser::Base]
40
- def parser
41
- @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
42
- parser.diagnostics.all_errors_are_fatal = true
43
- parser.diagnostics.ignore_warnings = true
44
- end
45
- end
46
-
47
- # @param source [Source]
48
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
49
- def map source
50
- NodeProcessor.process(source.node, Region.new(source: source))
51
- end
52
-
53
- # @param source [Source]
54
- # @param name [String]
55
- # @return [Array<Location>]
56
- def references source, name
57
- if name.end_with?("=")
58
- reg = /#{Regexp.escape name[0..-2]}\s*=/
59
- # @param code [String]
60
- # @param offset [Integer]
61
- # @return [Array(Integer, Integer), Array(nil, nil)]
62
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
63
- else
64
- # @param code [String]
65
- # @param offset [Integer]
66
- # @return [Array(Integer, Integer), Array(nil, nil)]
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
- offset = Position.to_offset(source.code, rng.start)
72
- soff, eoff = extract_offset[source.code, offset]
73
- Location.new(
74
- source.filename,
75
- Range.new(
76
- Position.from_offset(source.code, soff),
77
- Position.from_offset(source.code, eoff)
78
- )
79
- )
80
- end
81
- end
82
-
83
- # @param name [String]
84
- # @param top [AST::Node]
85
- # @return [Array<AST::Node>]
86
- def inner_node_references name, top
87
- result = []
88
- if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
89
- result.push top if top.children.any? { |c| c.to_s == name }
90
- top.children.each { |c| result.concat inner_node_references(name, c) }
91
- end
92
- result
93
- end
94
-
95
- # @return [Source::Chain]
96
- def chain *args
97
- NodeChainer.chain *args
98
- end
99
-
100
- # @return [Source::Chain]
101
- def chain_string *args
102
- NodeChainer.load_string *args
103
- end
104
-
105
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
106
- def process_node *args
107
- Solargraph::Parser::NodeProcessor.process *args
108
- end
109
-
110
- # @param node [Parser::AST::Node]
111
- # @return [String, nil]
112
- def infer_literal_node_type node
113
- NodeMethods.infer_literal_node_type node
114
- end
115
-
116
- # @return [Integer]
117
- def version
118
- parser.version
119
- end
120
-
121
- # @param node [BasicObject]
122
- # @return [Boolean]
123
- def is_ast_node? node
124
- node.is_a?(::Parser::AST::Node)
125
- end
126
-
127
- # @param node [Parser::AST::Node]
128
- # @return [Range]
129
- def node_range node
130
- st = Position.new(node.loc.line, node.loc.column)
131
- en = Position.new(node.loc.last_line, node.loc.last_column)
132
- Range.new(st, en)
133
- end
134
-
135
- # @param node [Parser::AST::Node]
136
- # @return [Array<Range>]
137
- def string_ranges node
138
- return [] unless is_ast_node?(node)
139
- result = []
140
- if node.type == :str
141
- result.push Range.from_node(node)
142
- end
143
- node.children.each do |child|
144
- result.concat string_ranges(child)
145
- end
146
- if node.type == :dstr && node.children.last.nil?
147
- last = node.children[-2]
148
- unless last.nil?
149
- rng = Range.from_node(last)
150
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
151
- result.push Range.new(pos, pos)
152
- end
153
- end
154
- result
155
- end
156
- end
157
- end
158
- end
159
- 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
+ # @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,19 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- # A custom builder for source parsers that ignores character encoding
7
- # issues in literal strings.
8
- #
9
- class FlawedBuilder < ::Parser::Builders::Default
10
- # @param token [::Parser::AST::Node]
11
- # @return [String]
12
- # @sg-ignore
13
- def string_value(token)
14
- value(token)
15
- end
16
- end
17
- end
18
- end
19
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ # A custom builder for source parsers that ignores character encoding
7
+ # issues in literal strings.
8
+ #
9
+ class FlawedBuilder < ::Parser::Builders::Default
10
+ # @param token [::Parser::AST::Node]
11
+ # @return [String]
12
+ # @sg-ignore
13
+ def string_value(token)
14
+ value(token)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end