solargraph 0.46.0 → 0.54.5

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +37 -41
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.gitignore +9 -9
  7. data/.rspec +2 -2
  8. data/.yardopts +2 -2
  9. data/CHANGELOG.md +1338 -1115
  10. data/Gemfile +0 -0
  11. data/LICENSE +1 -1
  12. data/README.md +131 -128
  13. data/Rakefile +0 -0
  14. data/SPONSORS.md +10 -18
  15. data/bin/solargraph +0 -0
  16. data/lib/solargraph/api_map/cache.rb +109 -70
  17. data/lib/solargraph/api_map/index.rb +167 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +88 -81
  19. data/lib/solargraph/api_map/store.rb +260 -256
  20. data/lib/solargraph/api_map.rb +870 -686
  21. data/lib/solargraph/bench.rb +44 -27
  22. data/lib/solargraph/cache.rb +77 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +217 -130
  24. data/lib/solargraph/complex_type/unique_type.rb +386 -75
  25. data/lib/solargraph/complex_type.rb +394 -221
  26. data/lib/solargraph/convention/base.rb +33 -33
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +22 -22
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention.rb +47 -47
  31. data/lib/solargraph/converters/dd.rb +17 -12
  32. data/lib/solargraph/converters/dl.rb +15 -12
  33. data/lib/solargraph/converters/dt.rb +15 -12
  34. data/lib/solargraph/converters/misc.rb +1 -1
  35. data/lib/solargraph/diagnostics/base.rb +29 -29
  36. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  37. data/lib/solargraph/diagnostics/rubocop.rb +113 -98
  38. data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
  39. data/lib/solargraph/diagnostics/severities.rb +15 -15
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/diagnostics.rb +55 -55
  43. data/lib/solargraph/doc_map.rb +188 -0
  44. data/lib/solargraph/environ.rb +45 -45
  45. data/lib/solargraph/equality.rb +33 -0
  46. data/lib/solargraph/gem_pins.rb +72 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  48. data/lib/solargraph/language_server/error_codes.rb +20 -20
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  50. data/lib/solargraph/language_server/host/dispatch.rb +128 -111
  51. data/lib/solargraph/language_server/host/message_worker.rb +106 -59
  52. data/lib/solargraph/language_server/host/sources.rb +99 -156
  53. data/lib/solargraph/language_server/host.rb +861 -865
  54. data/lib/solargraph/language_server/message/base.rb +96 -89
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  57. data/lib/solargraph/language_server/message/client.rb +11 -11
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  67. data/lib/solargraph/language_server/message/extended.rb +21 -21
  68. data/lib/solargraph/language_server/message/initialize.rb +191 -162
  69. data/lib/solargraph/language_server/message/initialized.rb +28 -27
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
  91. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  92. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  97. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  98. data/lib/solargraph/language_server/message.rb +94 -93
  99. data/lib/solargraph/language_server/message_types.rb +14 -14
  100. data/lib/solargraph/language_server/progress.rb +135 -0
  101. data/lib/solargraph/language_server/request.rb +24 -24
  102. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  103. data/lib/solargraph/language_server/transport/adapter.rb +68 -53
  104. data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
  105. data/lib/solargraph/language_server/transport.rb +13 -13
  106. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  107. data/lib/solargraph/language_server.rb +20 -19
  108. data/lib/solargraph/library.rb +663 -546
  109. data/lib/solargraph/location.rb +58 -37
  110. data/lib/solargraph/logging.rb +27 -27
  111. data/lib/solargraph/page.rb +89 -83
  112. data/lib/solargraph/parser/comment_ripper.rb +56 -52
  113. data/lib/solargraph/parser/node_methods.rb +83 -43
  114. data/lib/solargraph/parser/node_processor/base.rb +87 -77
  115. data/lib/solargraph/parser/node_processor.rb +45 -43
  116. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
  117. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
  118. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
  119. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  120. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
  121. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  122. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  123. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
  124. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
  125. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
  126. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
  127. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
  128. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
  129. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
  130. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
  131. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  132. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
  133. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
  134. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
  135. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  136. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
  137. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
  138. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  139. data/lib/solargraph/parser/parser_gem.rb +12 -0
  140. data/lib/solargraph/parser/region.rb +66 -66
  141. data/lib/solargraph/parser/snippet.rb +15 -13
  142. data/lib/solargraph/parser.rb +22 -26
  143. data/lib/solargraph/pin/base.rb +378 -296
  144. data/lib/solargraph/pin/base_variable.rb +118 -84
  145. data/lib/solargraph/pin/block.rb +101 -72
  146. data/lib/solargraph/pin/callable.rb +147 -0
  147. data/lib/solargraph/pin/class_variable.rb +8 -8
  148. data/lib/solargraph/pin/closure.rb +57 -37
  149. data/lib/solargraph/pin/common.rb +70 -70
  150. data/lib/solargraph/pin/constant.rb +43 -43
  151. data/lib/solargraph/pin/conversions.rb +123 -96
  152. data/lib/solargraph/pin/delegated_method.rb +101 -0
  153. data/lib/solargraph/pin/documenting.rb +98 -105
  154. data/lib/solargraph/pin/duck_method.rb +16 -16
  155. data/lib/solargraph/pin/global_variable.rb +8 -8
  156. data/lib/solargraph/pin/instance_variable.rb +34 -30
  157. data/lib/solargraph/pin/keyword.rb +15 -15
  158. data/lib/solargraph/pin/keyword_param.rb +8 -8
  159. data/lib/solargraph/pin/local_variable.rb +67 -55
  160. data/lib/solargraph/pin/method.rb +527 -245
  161. data/lib/solargraph/pin/method_alias.rb +31 -31
  162. data/lib/solargraph/pin/namespace.rb +107 -91
  163. data/lib/solargraph/pin/parameter.rb +212 -201
  164. data/lib/solargraph/pin/proxy_type.rb +29 -29
  165. data/lib/solargraph/pin/reference/extend.rb +10 -10
  166. data/lib/solargraph/pin/reference/include.rb +10 -10
  167. data/lib/solargraph/pin/reference/override.rb +29 -29
  168. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  169. data/lib/solargraph/pin/reference/require.rb +14 -14
  170. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  171. data/lib/solargraph/pin/reference.rb +22 -14
  172. data/lib/solargraph/pin/search.rb +56 -56
  173. data/lib/solargraph/pin/signature.rb +17 -0
  174. data/lib/solargraph/pin/singleton.rb +11 -11
  175. data/lib/solargraph/pin/symbol.rb +47 -47
  176. data/lib/solargraph/pin.rb +41 -37
  177. data/lib/solargraph/position.rb +107 -100
  178. data/lib/solargraph/range.rb +98 -95
  179. data/lib/solargraph/rbs_map/conversions.rb +646 -0
  180. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  181. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  182. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  183. data/lib/solargraph/rbs_map.rb +93 -0
  184. data/lib/solargraph/server_methods.rb +16 -16
  185. data/lib/solargraph/shell.rb +269 -226
  186. data/lib/solargraph/source/chain/array.rb +33 -0
  187. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  188. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  189. data/lib/solargraph/source/chain/call.rb +303 -204
  190. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  191. data/lib/solargraph/source/chain/constant.rb +89 -75
  192. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  193. data/lib/solargraph/source/chain/hash.rb +33 -28
  194. data/lib/solargraph/source/chain/head.rb +19 -19
  195. data/lib/solargraph/source/chain/if.rb +28 -0
  196. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  197. data/lib/solargraph/source/chain/link.rb +98 -71
  198. data/lib/solargraph/source/chain/literal.rb +28 -23
  199. data/lib/solargraph/source/chain/or.rb +23 -23
  200. data/lib/solargraph/source/chain/q_call.rb +11 -11
  201. data/lib/solargraph/source/chain/variable.rb +13 -13
  202. data/lib/solargraph/source/chain/z_super.rb +30 -30
  203. data/lib/solargraph/source/chain.rb +252 -164
  204. data/lib/solargraph/source/change.rb +82 -79
  205. data/lib/solargraph/source/cursor.rb +167 -164
  206. data/lib/solargraph/source/source_chainer.rb +194 -191
  207. data/lib/solargraph/source/updater.rb +55 -54
  208. data/lib/solargraph/source.rb +495 -522
  209. data/lib/solargraph/source_map/clip.rb +232 -224
  210. data/lib/solargraph/source_map/completion.rb +23 -23
  211. data/lib/solargraph/source_map/data.rb +30 -0
  212. data/lib/solargraph/source_map/mapper.rb +255 -212
  213. data/lib/solargraph/source_map.rb +217 -180
  214. data/lib/solargraph/type_checker/checks.rb +120 -99
  215. data/lib/solargraph/type_checker/param_def.rb +35 -35
  216. data/lib/solargraph/type_checker/problem.rb +32 -32
  217. data/lib/solargraph/type_checker/rules.rb +62 -57
  218. data/lib/solargraph/type_checker.rb +672 -543
  219. data/lib/solargraph/version.rb +5 -5
  220. data/lib/solargraph/views/environment.erb +56 -58
  221. data/lib/solargraph/workspace/config.rb +239 -231
  222. data/lib/solargraph/workspace.rb +239 -215
  223. data/lib/solargraph/yard_map/cache.rb +25 -19
  224. data/lib/solargraph/yard_map/helpers.rb +16 -16
  225. data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
  226. data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
  227. data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
  228. data/lib/solargraph/yard_map/mapper.rb +78 -77
  229. data/lib/solargraph/yard_map/to_method.rb +86 -79
  230. data/lib/solargraph/yard_map.rb +18 -460
  231. data/lib/solargraph/yard_tags.rb +20 -0
  232. data/lib/solargraph/yardoc.rb +52 -0
  233. data/lib/solargraph.rb +72 -69
  234. data/solargraph.gemspec +21 -10
  235. metadata +184 -115
  236. data/.travis.yml +0 -19
  237. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  238. data/lib/solargraph/compat.rb +0 -37
  239. data/lib/solargraph/convention/rspec.rb +0 -30
  240. data/lib/solargraph/documentor.rb +0 -76
  241. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  242. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  243. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  244. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  245. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  246. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  247. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  248. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  249. data/lib/solargraph/parser/legacy.rb +0 -12
  250. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  251. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  252. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  253. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  254. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  255. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  256. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  257. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  258. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  259. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  260. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  261. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  262. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  263. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  264. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  265. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  266. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  267. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  268. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  269. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  270. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  271. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  272. data/lib/solargraph/parser/rubyvm.rb +0 -40
  273. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  274. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  275. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  276. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  277. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  278. data/lib/yard-solargraph.rb +0 -33
  279. data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,164 +1,167 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- # Information about a position in a source, including the word located
6
- # there.
7
- #
8
- class Cursor
9
- # @return [Position]
10
- attr_reader :position
11
-
12
- # @return [Source]
13
- attr_reader :source
14
-
15
- # @param source [Source]
16
- # @param position [Position, Array(Integer, Integer)]
17
- def initialize source, position
18
- @source = source
19
- @position = Position.normalize(position)
20
- end
21
-
22
- # @return [String]
23
- def filename
24
- source.filename
25
- end
26
-
27
- # The whole word at the current position. Given the text `foo.bar`, the
28
- # word at position(0,6) is `bar`.
29
- #
30
- # @return [String]
31
- def word
32
- @word ||= start_of_word + end_of_word
33
- end
34
-
35
- # The part of the word before the current position. Given the text
36
- # `foo.bar`, the start_of_word at position(0, 6) is `ba`.
37
- #
38
- # @return [String]
39
- def start_of_word
40
- @start_of_word ||= begin
41
- match = source.code[0..offset-1].to_s.match(start_word_pattern)
42
- result = (match ? match[0] : '')
43
- # Including the preceding colon if the word appears to be a symbol
44
- result = ":#{result}" if source.code[0..offset-result.length-1].end_with?(':') and !source.code[0..offset-result.length-1].end_with?('::')
45
- result
46
- end
47
- end
48
-
49
- # The part of the word after the current position. Given the text
50
- # `foo.bar`, the end_of_word at position (0,6) is `r`.
51
- #
52
- # @return [String]
53
- def end_of_word
54
- @end_of_word ||= begin
55
- match = source.code[offset..-1].to_s.match(end_word_pattern)
56
- match ? match[0] : ''
57
- end
58
- end
59
-
60
- # @return [Boolean]
61
- def start_of_constant?
62
- source.code[offset-2, 2] == '::'
63
- end
64
-
65
- # The range of the word at the current position.
66
- #
67
- # @return [Range]
68
- def range
69
- @range ||= begin
70
- s = Position.from_offset(source.code, offset - start_of_word.length)
71
- e = Position.from_offset(source.code, offset + end_of_word.length)
72
- Solargraph::Range.new(s, e)
73
- end
74
- end
75
-
76
- # @return [Chain]
77
- def chain
78
- @chain ||= SourceChainer.chain(source, position)
79
- end
80
-
81
- # True if the statement at the cursor is an argument to a previous
82
- # method.
83
- #
84
- # Given the code `process(foo)`, a cursor pointing at `foo` would
85
- # identify it as an argument being passed to the `process` method.
86
- #
87
- # If #argument? is true, the #recipient method will return a cursor that
88
- # points to the method receiving the argument.
89
- #
90
- # @return [Boolean]
91
- def argument?
92
- # @argument ||= !signature_position.nil?
93
- @argument ||= !recipient.nil?
94
- end
95
-
96
- # @return [Boolean]
97
- def comment?
98
- @comment ||= source.comment_at?(position)
99
- end
100
-
101
- # @return [Boolean]
102
- def string?
103
- @string ||= source.string_at?(position)
104
- end
105
-
106
- # Get a cursor pointing to the method that receives the current statement
107
- # as an argument.
108
- #
109
- # @return [Cursor, nil]
110
- def recipient
111
- @recipient ||= begin
112
- node = recipient_node
113
- node ? Cursor.new(source, Range.from_node(node).ending) : nil
114
- end
115
- end
116
- alias receiver recipient
117
-
118
- def node
119
- @node ||= source.node_at(position.line, position.column)
120
- end
121
-
122
- # @return [Position]
123
- def node_position
124
- @node_position ||= begin
125
- if start_of_word.empty?
126
- match = source.code[0, offset].match(/[\s]*(\.|:+)[\s]*$/)
127
- if match
128
- Position.from_offset(source.code, offset - match[0].length)
129
- else
130
- position
131
- end
132
- else
133
- position
134
- end
135
- end
136
- end
137
-
138
- def recipient_node
139
- @recipient_node ||= Solargraph::Parser::NodeMethods.find_recipient_node(self)
140
- end
141
-
142
- # @return [Integer]
143
- def offset
144
- @offset ||= Position.to_offset(source.code, position)
145
- end
146
-
147
- private
148
-
149
- # A regular expression to find the start of a word from an offset.
150
- #
151
- # @return [Regexp]
152
- def start_word_pattern
153
- /(@{1,2}|\$)?([a-z0-9_]|[^\u0000-\u007F])*\z/i
154
- end
155
-
156
- # A regular expression to find the end of a word from an offset.
157
- #
158
- # @return [Regexp]
159
- def end_word_pattern
160
- /^([a-z0-9_]|[^\u0000-\u007F])*[\?\!]?/i
161
- end
162
- end
163
- end
164
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ # Information about a single Position in a Source, including the
6
+ # word located there.
7
+ #
8
+ class Cursor
9
+ # @return [Position]
10
+ attr_reader :position
11
+
12
+ # @return [Source]
13
+ attr_reader :source
14
+
15
+ # @param source [Source]
16
+ # @param position [Position, Array(Integer, Integer)]
17
+ def initialize source, position
18
+ @source = source
19
+ @position = Position.normalize(position)
20
+ end
21
+
22
+ # @return [String]
23
+ def filename
24
+ source.filename
25
+ end
26
+
27
+ # The whole word at the current position. Given the text `foo.bar`, the
28
+ # word at position(0,6) is `bar`.
29
+ #
30
+ # @return [String]
31
+ def word
32
+ @word ||= start_of_word + end_of_word
33
+ end
34
+
35
+ # The part of the word before the current position. Given the text
36
+ # `foo.bar`, the start_of_word at position(0, 6) is `ba`.
37
+ #
38
+ # @sg-ignore Improve resolution of String#match below
39
+ # @return [String]
40
+ def start_of_word
41
+ @start_of_word ||= begin
42
+ match = source.code[0..offset-1].to_s.match(start_word_pattern)
43
+ result = (match ? match[0] : '')
44
+ # Including the preceding colon if the word appears to be a symbol
45
+ result = ":#{result}" if source.code[0..offset-result.length-1].end_with?(':') and !source.code[0..offset-result.length-1].end_with?('::')
46
+ result
47
+ end
48
+ end
49
+
50
+ # The part of the word after the current position. Given the text
51
+ # `foo.bar`, the end_of_word at position (0,6) is `r`.
52
+ #
53
+ # @return [String]
54
+ def end_of_word
55
+ @end_of_word ||= begin
56
+ match = source.code[offset..-1].to_s.match(end_word_pattern)
57
+ match ? match[0] : ''
58
+ end
59
+ end
60
+
61
+ # @return [Boolean]
62
+ def start_of_constant?
63
+ source.code[offset-2, 2] == '::'
64
+ end
65
+
66
+ # The range of the word at the current position.
67
+ #
68
+ # @return [Range]
69
+ def range
70
+ @range ||= begin
71
+ s = Position.from_offset(source.code, offset - start_of_word.length)
72
+ e = Position.from_offset(source.code, offset + end_of_word.length)
73
+ Solargraph::Range.new(s, e)
74
+ end
75
+ end
76
+
77
+ # @return [Chain]
78
+ def chain
79
+ @chain ||= SourceChainer.chain(source, position)
80
+ end
81
+
82
+ # True if the statement at the cursor is an argument to a previous
83
+ # method.
84
+ #
85
+ # Given the code `process(foo)`, a cursor pointing at `foo` would
86
+ # identify it as an argument being passed to the `process` method.
87
+ #
88
+ # If #argument? is true, the #recipient method will return a cursor that
89
+ # points to the method receiving the argument.
90
+ #
91
+ # @return [Boolean]
92
+ def argument?
93
+ # @argument ||= !signature_position.nil?
94
+ @argument ||= !recipient.nil?
95
+ end
96
+
97
+ # @return [Boolean]
98
+ def comment?
99
+ @comment ||= source.comment_at?(position)
100
+ end
101
+
102
+ # @return [Boolean]
103
+ def string?
104
+ @string ||= source.string_at?(position)
105
+ end
106
+
107
+ # Get a cursor pointing to the method that receives the current statement
108
+ # as an argument.
109
+ #
110
+ # @return [Cursor, nil]
111
+ def recipient
112
+ @recipient ||= begin
113
+ node = recipient_node
114
+ node ? Cursor.new(source, Range.from_node(node).ending) : nil
115
+ end
116
+ end
117
+ alias receiver recipient
118
+
119
+ # @return [AST::Node]
120
+ def node
121
+ @node ||= source.node_at(position.line, position.column)
122
+ end
123
+
124
+ # @return [Position]
125
+ def node_position
126
+ @node_position ||= begin
127
+ if start_of_word.empty?
128
+ match = source.code[0, offset].match(/[\s]*(\.|:+)[\s]*$/)
129
+ if match
130
+ Position.from_offset(source.code, offset - match[0].length)
131
+ else
132
+ position
133
+ end
134
+ else
135
+ position
136
+ end
137
+ end
138
+ end
139
+
140
+ # @return [Parser::AST::Node, nil]
141
+ def recipient_node
142
+ @recipient_node ||= Solargraph::Parser::NodeMethods.find_recipient_node(self)
143
+ end
144
+
145
+ # @return [Integer]
146
+ def offset
147
+ @offset ||= Position.to_offset(source.code, position)
148
+ end
149
+
150
+ private
151
+
152
+ # A regular expression to find the start of a word from an offset.
153
+ #
154
+ # @return [Regexp]
155
+ def start_word_pattern
156
+ /(@{1,2}|\$)?([a-z0-9_]|[^\u0000-\u007F])*\z/i
157
+ end
158
+
159
+ # A regular expression to find the end of a word from an offset.
160
+ #
161
+ # @return [Regexp]
162
+ def end_word_pattern
163
+ /^([a-z0-9_]|[^\u0000-\u007F])*[\?\!]?/i
164
+ end
165
+ end
166
+ end
167
+ end