solargraph 0.54.4 → 0.58.2

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +184 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +140 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +18 -1
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  35. data/lib/solargraph/convention/struct_definition.rb +164 -0
  36. data/lib/solargraph/convention.rb +35 -4
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -188
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -72
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -861
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  53. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  56. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  57. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  58. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  59. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  60. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  61. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  62. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  63. data/lib/solargraph/language_server/progress.rb +8 -0
  64. data/lib/solargraph/language_server/request.rb +4 -1
  65. data/lib/solargraph/library.rb +683 -662
  66. data/lib/solargraph/location.rb +82 -58
  67. data/lib/solargraph/logging.rb +37 -27
  68. data/lib/solargraph/page.rb +3 -0
  69. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  70. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  71. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  72. data/lib/solargraph/parser/node_processor.rb +62 -45
  73. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  74. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  75. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  76. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  77. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  79. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  80. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  81. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  82. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  83. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  85. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  86. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  89. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  90. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  91. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  92. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  94. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  95. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  96. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  97. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  101. data/lib/solargraph/parser/region.rb +69 -66
  102. data/lib/solargraph/parser/snippet.rb +17 -15
  103. data/lib/solargraph/parser.rb +1 -0
  104. data/lib/solargraph/pin/base.rb +729 -378
  105. data/lib/solargraph/pin/base_variable.rb +126 -118
  106. data/lib/solargraph/pin/block.rb +104 -101
  107. data/lib/solargraph/pin/breakable.rb +9 -0
  108. data/lib/solargraph/pin/callable.rb +231 -147
  109. data/lib/solargraph/pin/closure.rb +72 -57
  110. data/lib/solargraph/pin/common.rb +79 -70
  111. data/lib/solargraph/pin/constant.rb +2 -0
  112. data/lib/solargraph/pin/conversions.rb +123 -123
  113. data/lib/solargraph/pin/delegated_method.rb +120 -101
  114. data/lib/solargraph/pin/documenting.rb +114 -98
  115. data/lib/solargraph/pin/instance_variable.rb +34 -34
  116. data/lib/solargraph/pin/keyword.rb +20 -15
  117. data/lib/solargraph/pin/local_variable.rb +75 -67
  118. data/lib/solargraph/pin/method.rb +672 -527
  119. data/lib/solargraph/pin/method_alias.rb +34 -31
  120. data/lib/solargraph/pin/namespace.rb +115 -107
  121. data/lib/solargraph/pin/parameter.rb +275 -212
  122. data/lib/solargraph/pin/proxy_type.rb +39 -29
  123. data/lib/solargraph/pin/reference/override.rb +47 -29
  124. data/lib/solargraph/pin/reference/require.rb +2 -2
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  126. data/lib/solargraph/pin/reference.rb +39 -22
  127. data/lib/solargraph/pin/search.rb +61 -56
  128. data/lib/solargraph/pin/signature.rb +61 -17
  129. data/lib/solargraph/pin/singleton.rb +1 -1
  130. data/lib/solargraph/pin/symbol.rb +53 -47
  131. data/lib/solargraph/pin/until.rb +18 -0
  132. data/lib/solargraph/pin/while.rb +18 -0
  133. data/lib/solargraph/pin.rb +44 -41
  134. data/lib/solargraph/pin_cache.rb +245 -0
  135. data/lib/solargraph/position.rb +132 -107
  136. data/lib/solargraph/range.rb +112 -98
  137. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  138. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  139. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  140. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  141. data/lib/solargraph/rbs_map.rb +163 -93
  142. data/lib/solargraph/shell.rb +352 -269
  143. data/lib/solargraph/source/chain/array.rb +11 -7
  144. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  145. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  146. data/lib/solargraph/source/chain/call.rb +337 -303
  147. data/lib/solargraph/source/chain/constant.rb +26 -89
  148. data/lib/solargraph/source/chain/hash.rb +34 -33
  149. data/lib/solargraph/source/chain/head.rb +1 -1
  150. data/lib/solargraph/source/chain/if.rb +28 -28
  151. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  152. data/lib/solargraph/source/chain/link.rb +13 -2
  153. data/lib/solargraph/source/chain/literal.rb +48 -28
  154. data/lib/solargraph/source/chain/or.rb +23 -23
  155. data/lib/solargraph/source/chain/z_super.rb +1 -1
  156. data/lib/solargraph/source/chain.rb +291 -252
  157. data/lib/solargraph/source/change.rb +82 -82
  158. data/lib/solargraph/source/cursor.rb +166 -167
  159. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -495
  163. data/lib/solargraph/source_map/clip.rb +226 -232
  164. data/lib/solargraph/source_map/data.rb +34 -30
  165. data/lib/solargraph/source_map/mapper.rb +259 -255
  166. data/lib/solargraph/source_map.rb +212 -217
  167. data/lib/solargraph/type_checker/checks.rb +124 -120
  168. data/lib/solargraph/type_checker/param_def.rb +37 -35
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -62
  171. data/lib/solargraph/type_checker.rb +814 -672
  172. data/lib/solargraph/version.rb +5 -5
  173. data/lib/solargraph/views/_method.erb +10 -10
  174. data/lib/solargraph/views/_namespace.erb +3 -3
  175. data/lib/solargraph/views/document.erb +10 -10
  176. data/lib/solargraph/workspace/config.rb +255 -239
  177. data/lib/solargraph/workspace/require_paths.rb +97 -0
  178. data/lib/solargraph/workspace.rb +220 -239
  179. data/lib/solargraph/yard_map/helpers.rb +44 -16
  180. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  181. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  182. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  183. data/lib/solargraph/yard_map/mapper.rb +79 -78
  184. data/lib/solargraph/yard_map/to_method.rb +89 -86
  185. data/lib/solargraph/yardoc.rb +87 -52
  186. data/lib/solargraph.rb +105 -72
  187. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  188. data/rbs/fills/open3/0/open3.rbs +172 -0
  189. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  190. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  191. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  192. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  193. data/rbs/fills/tuple/tuple.rbs +149 -0
  194. data/rbs/shims/ast/0/node.rbs +5 -0
  195. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  196. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  197. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  198. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  199. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  200. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  201. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  202. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  203. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  204. data/rbs_collection.yaml +19 -0
  205. data/solargraph.gemspec +27 -5
  206. metadata +215 -18
  207. data/lib/.rubocop.yml +0 -22
  208. data/lib/solargraph/cache.rb +0 -77
  209. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,87 +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::BaseVariable>]
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 [void]
34
- def process
35
- process_children
36
- end
37
-
38
- private
39
-
40
- # @param subregion [Region]
41
- # @return [void]
42
- def process_children subregion = region
43
- return if @processed_children
44
- @processed_children = true
45
- node.children.each do |child|
46
- next unless Parser.is_ast_node?(child)
47
- NodeProcessor.process(child, subregion, pins, locals)
48
- end
49
- end
50
-
51
- # @param node [Parser::AST::Node]
52
- # @return [Solargraph::Location]
53
- def get_node_location(node)
54
- range = Parser.node_range(node)
55
- Location.new(region.filename, range)
56
- end
57
-
58
- # @param node [Parser::AST::Node]
59
- # @return [String, nil]
60
- def comments_for(node)
61
- region.source.comments_for(node)
62
- end
63
-
64
- # @param position [Solargraph::Position]
65
- # @return [Pin::Closure, nil]
66
- def named_path_pin position
67
- pins.select{|pin| pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)}.last
68
- end
69
-
70
- # @todo Candidate for deprecation
71
- # @param position [Solargraph::Position]
72
- # @return [Pin::Closure, nil]
73
- def block_pin position
74
- # @todo determine if this can return a Pin::Block
75
- pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
76
- end
77
-
78
- # @todo Candidate for deprecation
79
- # @param position [Solargraph::Position]
80
- # @return [Pin::Closure, nil]
81
- def closure_pin position
82
- pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
83
- end
84
- end
85
- end
86
- end
87
- 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,45 +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, Class<NodeProcessor::Base>>]
13
- @@processors ||= {}
14
-
15
- # Register a processor for a node type.
16
- #
17
- # @param type [Symbol]
18
- # @param cls [Class<NodeProcessor::Base>]
19
- # @return [Class<NodeProcessor::Base>]
20
- def register type, cls
21
- @@processors[type] = cls
22
- end
23
- end
24
-
25
- # @param node [Parser::AST::Node]
26
- # @param region [Region]
27
- # @param pins [Array<Pin::Base>]
28
- # @param locals [Array<Pin::BaseVariable>]
29
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
30
- def self.process node, region = Region.new, pins = [], locals = []
31
- if pins.empty?
32
- pins.push Pin::Namespace.new(
33
- location: region.source.location,
34
- name: ''
35
- )
36
- end
37
- return [pins, locals] unless Parser.is_ast_node?(node)
38
- klass = @@processors[node.type] || NodeProcessor::Base
39
- processor = klass.new(node, region, pins, locals)
40
- processor.process
41
- [processor.pins, processor.locals]
42
- end
43
- end
44
- end
45
- 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,157 +1,149 @@
1
- # frozen_string_literal: true
2
-
3
- require 'parser/current'
4
- require 'parser/source/buffer'
5
-
6
- module Solargraph
7
- module Parser
8
- module ParserGem
9
- module ClassMethods
10
- # @param code [String]
11
- # @param filename [String, nil]
12
- # @return [Array(Parser::AST::Node, Hash{Integer => String})]
13
- def parse_with_comments code, filename = nil
14
- buffer = ::Parser::Source::Buffer.new(filename, 0)
15
- buffer.source = code
16
- node = parser.parse(buffer)
17
- comments = CommentRipper.new(code, filename, 0).parse
18
- [node, comments]
19
- rescue ::Parser::SyntaxError => e
20
- raise Parser::SyntaxError, e.message
21
- end
22
-
23
- # @param code [String]
24
- # @param filename [String, nil]
25
- # @param line [Integer]
26
- # @return [Parser::AST::Node]
27
- def parse code, filename = nil, line = 0
28
- buffer = ::Parser::Source::Buffer.new(filename, line)
29
- buffer.source = code
30
- parser.parse(buffer)
31
- rescue ::Parser::SyntaxError => e
32
- raise Parser::SyntaxError, e.message
33
- end
34
-
35
- # @return [::Parser::Base]
36
- def parser
37
- # @todo Consider setting an instance variable. We might not need to
38
- # recreate the parser every time we use it.
39
- parser = ::Parser::CurrentRuby.new(FlawedBuilder.new)
40
- parser.diagnostics.all_errors_are_fatal = true
41
- parser.diagnostics.ignore_warnings = true
42
- parser
43
- end
44
-
45
- # @param source [Source]
46
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
47
- def map source
48
- NodeProcessor.process(source.node, Region.new(source: source))
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
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
61
- else
62
- # @param code [String]
63
- # @param offset [Integer]
64
- # @return [Array(Integer, Integer), Array(nil, nil)]
65
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
66
- end
67
- inner_node_references(name, source.node).map do |n|
68
- rng = Range.from_node(n)
69
- offset = Position.to_offset(source.code, rng.start)
70
- soff, eoff = extract_offset[source.code, offset]
71
- Location.new(
72
- source.filename,
73
- Range.new(
74
- Position.from_offset(source.code, soff),
75
- Position.from_offset(source.code, eoff)
76
- )
77
- )
78
- end
79
- end
80
-
81
- # @param name [String]
82
- # @param top [AST::Node]
83
- # @return [Array<AST::Node>]
84
- def inner_node_references name, top
85
- result = []
86
- if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
87
- result.push top if top.children.any? { |c| c.to_s == name }
88
- top.children.each { |c| result.concat inner_node_references(name, c) }
89
- end
90
- result
91
- end
92
-
93
- # @return [Source::Chain]
94
- def chain *args
95
- NodeChainer.chain *args
96
- end
97
-
98
- # @return [Source::Chain]
99
- def chain_string *args
100
- NodeChainer.load_string *args
101
- end
102
-
103
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
104
- def process_node *args
105
- Solargraph::Parser::NodeProcessor.process *args
106
- end
107
-
108
- # @param node [Parser::AST::Node]
109
- # @return [String, nil]
110
- def infer_literal_node_type node
111
- NodeMethods.infer_literal_node_type node
112
- end
113
-
114
- # @return [Integer]
115
- def version
116
- parser.version
117
- end
118
-
119
- # @param node [BasicObject]
120
- # @return [Boolean]
121
- def is_ast_node? node
122
- node.is_a?(::Parser::AST::Node)
123
- end
124
-
125
- # @param node [Parser::AST::Node]
126
- # @return [Range]
127
- def node_range node
128
- st = Position.new(node.loc.line, node.loc.column)
129
- en = Position.new(node.loc.last_line, node.loc.last_column)
130
- Range.new(st, en)
131
- end
132
-
133
- # @param node [Parser::AST::Node]
134
- # @return [Array<Range>]
135
- def string_ranges node
136
- return [] unless is_ast_node?(node)
137
- result = []
138
- if node.type == :str
139
- result.push Range.from_node(node)
140
- end
141
- node.children.each do |child|
142
- result.concat string_ranges(child)
143
- end
144
- if node.type == :dstr && node.children.last.nil?
145
- last = node.children[-2]
146
- unless last.nil?
147
- rng = Range.from_node(last)
148
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
149
- result.push Range.new(pos, pos)
150
- end
151
- end
152
- result
153
- end
154
- end
155
- end
156
- end
157
- 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
@@ -9,6 +9,7 @@ module Solargraph
9
9
  class FlawedBuilder < ::Parser::Builders::Default
10
10
  # @param token [::Parser::AST::Node]
11
11
  # @return [String]
12
+ # @sg-ignore
12
13
  def string_value(token)
13
14
  value(token)
14
15
  end