solargraph 0.44.2 → 0.46.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,224 +1,224 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class SourceMap
5
- # A static analysis tool for obtaining definitions, completions,
6
- # signatures, and type inferences from a cursor.
7
- #
8
- class Clip
9
- # @param api_map [ApiMap]
10
- # @param cursor [Source::Cursor]
11
- def initialize api_map, cursor
12
- @api_map = api_map
13
- @cursor = cursor
14
- end
15
-
16
- # @return [Array<Pin::Base>]
17
- def define
18
- return [] if cursor.comment? || cursor.chain.literal?
19
- result = cursor.chain.define(api_map, block, locals)
20
- result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
21
- result
22
- end
23
-
24
- # @return [Completion]
25
- def complete
26
- return package_completions([]) if !source_map.source.parsed? || cursor.string?
27
- return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
28
- return Completion.new([], cursor.range) if cursor.chain.literal?
29
- if cursor.comment?
30
- tag_complete
31
- else
32
- code_complete
33
- end
34
- end
35
-
36
- # @return [Array<Pin::Base>]
37
- def signify
38
- return [] unless cursor.argument?
39
- chain = Parser.chain(cursor.recipient_node, cursor.filename)
40
- chain.define(api_map, context_pin, locals).select { |pin| pin.is_a?(Pin::Method) }
41
- end
42
-
43
- # @return [ComplexType]
44
- def infer
45
- result = cursor.chain.infer(api_map, block, locals)
46
- return result unless result.tag == 'self'
47
- ComplexType.try_parse(cursor.chain.base.infer(api_map, block, locals).namespace)
48
- end
49
-
50
- # Get an array of all the locals that are visible from the cursors's
51
- # position. Locals can be local variables, method parameters, or block
52
- # parameters. The array starts with the nearest local pin.
53
- #
54
- # @return [Array<Solargraph::Pin::Base>]
55
- def locals
56
- @locals ||= source_map.locals_at(location)
57
- end
58
-
59
- def gates
60
- block.gates
61
- end
62
-
63
- def in_block?
64
- return @in_block unless @in_block.nil?
65
- @in_block = begin
66
- tree = cursor.source.tree_at(cursor.position.line, cursor.position.column)
67
- Parser.is_ast_node?(tree[1]) && [:block, :ITER].include?(tree[1].type)
68
- end
69
- end
70
-
71
- # @param phrase [String]
72
- # @return [Array<Solargraph::Pin::Base>]
73
- def translate phrase
74
- chain = Parser.chain(Parser.parse(phrase))
75
- chain.define(api_map, block, locals)
76
- end
77
-
78
- private
79
-
80
- # @return [ApiMap]
81
- attr_reader :api_map
82
-
83
- # @return [Source::Cursor]
84
- attr_reader :cursor
85
-
86
- # @return [SourceMap]
87
- def source_map
88
- @source_map ||= api_map.source_map(cursor.filename)
89
- end
90
-
91
- def location
92
- Location.new(source_map.filename, Solargraph::Range.new(cursor.position, cursor.position))
93
- end
94
-
95
- # @return [Solargraph::Pin::Base]
96
- def block
97
- @block ||= source_map.locate_block_pin(cursor.node_position.line, cursor.node_position.character)
98
- end
99
-
100
- # The context at the current position.
101
- #
102
- # @return [Pin::Base]
103
- def context_pin
104
- @context_pin ||= source_map.locate_named_path_pin(cursor.node_position.line, cursor.node_position.character)
105
- end
106
-
107
- # @return [Array<Pin::Base>]
108
- def yielded_self_pins
109
- return [] unless block.is_a?(Pin::Block) && block.receiver
110
- chain = Parser.chain(block.receiver, source_map.source.filename)
111
- receiver_pin = chain.define(api_map, context_pin, locals).first
112
- return [] if receiver_pin.nil?
113
- result = []
114
- ys = receiver_pin.docstring.tag(:yieldpublic)
115
- unless ys.nil? || ys.types.empty?
116
- ysct = ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
117
- result.concat api_map.get_complex_type_methods(ysct, '', false)
118
- end
119
- result
120
- end
121
-
122
- # @return [Array<Pin::KeywordParam]
123
- def complete_keyword_parameters
124
- return [] unless cursor.argument? && cursor.chain.links.one? && cursor.word =~ /^[a-z0-9_]*:?$/
125
- pins = signify
126
- result = []
127
- done = []
128
- pins.each do |pin|
129
- pin.parameters.each do |param|
130
- next if done.include?(param.name)
131
- done.push param.name
132
- next unless param.keyword?
133
- result.push Pin::KeywordParam.new(pin.location, "#{param.name}:")
134
- end
135
- if !pin.parameters.empty? && pin.parameters.last.kwrestarg?
136
- pin.docstring.tags(:param).each do |tag|
137
- next if done.include?(tag.name)
138
- done.push tag.name
139
- result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
140
- end
141
- end
142
- end
143
- result
144
- end
145
-
146
- # @param result [Array<Pin::Base>]
147
- # @return [Completion]
148
- def package_completions result
149
- frag_start = cursor.start_of_word.to_s.downcase
150
- filtered = result.uniq(&:name).select { |s|
151
- s.name.downcase.start_with?(frag_start) &&
152
- (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(\!|\?|=)?$/i))
153
- }
154
- Completion.new(filtered, cursor.range)
155
- end
156
-
157
- def tag_complete
158
- result = []
159
- match = source_map.code[0..cursor.offset-1].match(/[\[<, ]([a-z0-9_:]*)\z/i)
160
- if match
161
- full = match[1]
162
- if full.include?('::')
163
- if full.end_with?('::')
164
- result.concat api_map.get_constants(full[0..-3], *gates)
165
- else
166
- result.concat api_map.get_constants(full.split('::')[0..-2].join('::'), *gates)
167
- end
168
- else
169
- result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
170
- end
171
- end
172
- package_completions(result)
173
- end
174
-
175
- def code_complete
176
- result = []
177
- result.concat complete_keyword_parameters
178
- if cursor.chain.constant? || cursor.start_of_constant?
179
- full = cursor.chain.links.first.word
180
- type = if cursor.chain.undefined?
181
- cursor.chain.base.infer(api_map, context_pin, locals)
182
- else
183
- if full.include?('::') && cursor.chain.links.length == 1
184
- ComplexType.try_parse(full.split('::')[0..-2].join('::'))
185
- elsif cursor.chain.links.length > 1
186
- ComplexType.try_parse(full)
187
- else
188
- ComplexType::UNDEFINED
189
- end
190
- end
191
- if type.undefined?
192
- if full.include?('::')
193
- result.concat api_map.get_constants(full, *gates)
194
- else
195
- result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
196
- end
197
- else
198
- result.concat api_map.get_constants(type.namespace, cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
199
- end
200
- else
201
- type = cursor.chain.base.infer(api_map, block, locals)
202
- result.concat api_map.get_complex_type_methods(type, block.binder.namespace, cursor.chain.links.length == 1)
203
- if cursor.chain.links.length == 1
204
- if cursor.word.start_with?('@@')
205
- return package_completions(api_map.get_class_variable_pins(context_pin.full_context.namespace))
206
- elsif cursor.word.start_with?('@')
207
- return package_completions(api_map.get_instance_variable_pins(block.binder.namespace, block.binder.scope))
208
- elsif cursor.word.start_with?('$')
209
- return package_completions(api_map.get_global_variable_pins)
210
- end
211
- result.concat locals
212
- result.concat api_map.get_constants(context_pin.context.namespace, *gates)
213
- result.concat api_map.get_methods(block.binder.namespace, scope: block.binder.scope, visibility: [:public, :private, :protected])
214
- result.concat api_map.get_methods('Kernel')
215
- # result.concat ApiMap.keywords
216
- result.concat api_map.keyword_pins.to_a
217
- result.concat yielded_self_pins
218
- end
219
- end
220
- package_completions(result)
221
- end
222
- end
223
- end
224
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class SourceMap
5
+ # A static analysis tool for obtaining definitions, completions,
6
+ # signatures, and type inferences from a cursor.
7
+ #
8
+ class Clip
9
+ # @param api_map [ApiMap]
10
+ # @param cursor [Source::Cursor]
11
+ def initialize api_map, cursor
12
+ @api_map = api_map
13
+ @cursor = cursor
14
+ end
15
+
16
+ # @return [Array<Pin::Base>]
17
+ def define
18
+ return [] if cursor.comment? || cursor.chain.literal?
19
+ result = cursor.chain.define(api_map, block, locals)
20
+ result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
21
+ result
22
+ end
23
+
24
+ # @return [Completion]
25
+ def complete
26
+ return package_completions([]) if !source_map.source.parsed? || cursor.string?
27
+ return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
28
+ return Completion.new([], cursor.range) if cursor.chain.literal?
29
+ if cursor.comment?
30
+ tag_complete
31
+ else
32
+ code_complete
33
+ end
34
+ end
35
+
36
+ # @return [Array<Pin::Base>]
37
+ def signify
38
+ return [] unless cursor.argument?
39
+ chain = Parser.chain(cursor.recipient_node, cursor.filename)
40
+ chain.define(api_map, context_pin, locals).select { |pin| pin.is_a?(Pin::Method) }
41
+ end
42
+
43
+ # @return [ComplexType]
44
+ def infer
45
+ result = cursor.chain.infer(api_map, block, locals)
46
+ return result unless result.tag == 'self'
47
+ ComplexType.try_parse(cursor.chain.base.infer(api_map, block, locals).namespace)
48
+ end
49
+
50
+ # Get an array of all the locals that are visible from the cursors's
51
+ # position. Locals can be local variables, method parameters, or block
52
+ # parameters. The array starts with the nearest local pin.
53
+ #
54
+ # @return [Array<Solargraph::Pin::Base>]
55
+ def locals
56
+ @locals ||= source_map.locals_at(location)
57
+ end
58
+
59
+ def gates
60
+ block.gates
61
+ end
62
+
63
+ def in_block?
64
+ return @in_block unless @in_block.nil?
65
+ @in_block = begin
66
+ tree = cursor.source.tree_at(cursor.position.line, cursor.position.column)
67
+ Parser.is_ast_node?(tree[1]) && [:block, :ITER].include?(tree[1].type)
68
+ end
69
+ end
70
+
71
+ # @param phrase [String]
72
+ # @return [Array<Solargraph::Pin::Base>]
73
+ def translate phrase
74
+ chain = Parser.chain(Parser.parse(phrase))
75
+ chain.define(api_map, block, locals)
76
+ end
77
+
78
+ private
79
+
80
+ # @return [ApiMap]
81
+ attr_reader :api_map
82
+
83
+ # @return [Source::Cursor]
84
+ attr_reader :cursor
85
+
86
+ # @return [SourceMap]
87
+ def source_map
88
+ @source_map ||= api_map.source_map(cursor.filename)
89
+ end
90
+
91
+ def location
92
+ Location.new(source_map.filename, Solargraph::Range.new(cursor.position, cursor.position))
93
+ end
94
+
95
+ # @return [Solargraph::Pin::Base]
96
+ def block
97
+ @block ||= source_map.locate_block_pin(cursor.node_position.line, cursor.node_position.character)
98
+ end
99
+
100
+ # The context at the current position.
101
+ #
102
+ # @return [Pin::Base]
103
+ def context_pin
104
+ @context_pin ||= source_map.locate_named_path_pin(cursor.node_position.line, cursor.node_position.character)
105
+ end
106
+
107
+ # @return [Array<Pin::Base>]
108
+ def yielded_self_pins
109
+ return [] unless block.is_a?(Pin::Block) && block.receiver
110
+ chain = Parser.chain(block.receiver, source_map.source.filename)
111
+ receiver_pin = chain.define(api_map, context_pin, locals).first
112
+ return [] if receiver_pin.nil?
113
+ result = []
114
+ ys = receiver_pin.docstring.tag(:yieldpublic)
115
+ unless ys.nil? || ys.types.empty?
116
+ ysct = ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
117
+ result.concat api_map.get_complex_type_methods(ysct, '', false)
118
+ end
119
+ result
120
+ end
121
+
122
+ # @return [Array<Pin::KeywordParam]
123
+ def complete_keyword_parameters
124
+ return [] unless cursor.argument? && cursor.chain.links.one? && cursor.word =~ /^[a-z0-9_]*:?$/
125
+ pins = signify
126
+ result = []
127
+ done = []
128
+ pins.each do |pin|
129
+ pin.parameters.each do |param|
130
+ next if done.include?(param.name)
131
+ done.push param.name
132
+ next unless param.keyword?
133
+ result.push Pin::KeywordParam.new(pin.location, "#{param.name}:")
134
+ end
135
+ if !pin.parameters.empty? && pin.parameters.last.kwrestarg?
136
+ pin.docstring.tags(:param).each do |tag|
137
+ next if done.include?(tag.name)
138
+ done.push tag.name
139
+ result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
140
+ end
141
+ end
142
+ end
143
+ result
144
+ end
145
+
146
+ # @param result [Array<Pin::Base>]
147
+ # @return [Completion]
148
+ def package_completions result
149
+ frag_start = cursor.start_of_word.to_s.downcase
150
+ filtered = result.uniq(&:name).select { |s|
151
+ s.name.downcase.start_with?(frag_start) &&
152
+ (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(\!|\?|=)?$/i))
153
+ }
154
+ Completion.new(filtered, cursor.range)
155
+ end
156
+
157
+ def tag_complete
158
+ result = []
159
+ match = source_map.code[0..cursor.offset-1].match(/[\[<, ]([a-z0-9_:]*)\z/i)
160
+ if match
161
+ full = match[1]
162
+ if full.include?('::')
163
+ if full.end_with?('::')
164
+ result.concat api_map.get_constants(full[0..-3], *gates)
165
+ else
166
+ result.concat api_map.get_constants(full.split('::')[0..-2].join('::'), *gates)
167
+ end
168
+ else
169
+ result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
170
+ end
171
+ end
172
+ package_completions(result)
173
+ end
174
+
175
+ def code_complete
176
+ result = []
177
+ result.concat complete_keyword_parameters
178
+ if cursor.chain.constant? || cursor.start_of_constant?
179
+ full = cursor.chain.links.first.word
180
+ type = if cursor.chain.undefined?
181
+ cursor.chain.base.infer(api_map, context_pin, locals)
182
+ else
183
+ if full.include?('::') && cursor.chain.links.length == 1
184
+ ComplexType.try_parse(full.split('::')[0..-2].join('::'))
185
+ elsif cursor.chain.links.length > 1
186
+ ComplexType.try_parse(full)
187
+ else
188
+ ComplexType::UNDEFINED
189
+ end
190
+ end
191
+ if type.undefined?
192
+ if full.include?('::')
193
+ result.concat api_map.get_constants(full, *gates)
194
+ else
195
+ result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
196
+ end
197
+ else
198
+ result.concat api_map.get_constants(type.namespace, cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
199
+ end
200
+ else
201
+ type = cursor.chain.base.infer(api_map, block, locals)
202
+ result.concat api_map.get_complex_type_methods(type, block.binder.namespace, cursor.chain.links.length == 1)
203
+ if cursor.chain.links.length == 1
204
+ if cursor.word.start_with?('@@')
205
+ return package_completions(api_map.get_class_variable_pins(context_pin.full_context.namespace))
206
+ elsif cursor.word.start_with?('@')
207
+ return package_completions(api_map.get_instance_variable_pins(block.binder.namespace, block.binder.scope))
208
+ elsif cursor.word.start_with?('$')
209
+ return package_completions(api_map.get_global_variable_pins)
210
+ end
211
+ result.concat locals
212
+ result.concat api_map.get_constants(context_pin.context.namespace, *gates)
213
+ result.concat api_map.get_methods(block.binder.namespace, scope: block.binder.scope, visibility: [:public, :private, :protected])
214
+ result.concat api_map.get_methods('Kernel')
215
+ # result.concat ApiMap.keywords
216
+ result.concat api_map.keyword_pins.to_a
217
+ result.concat yielded_self_pins
218
+ end
219
+ end
220
+ package_completions(result)
221
+ end
222
+ end
223
+ end
224
+ end
@@ -1,23 +1,23 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class SourceMap
5
- # The result of a completion request containing the pins that describe
6
- # completion options and the range to be replaced.
7
- #
8
- class Completion
9
- # @return [Array<Solargraph::Pin::Base>]
10
- attr_reader :pins
11
-
12
- # @return [Solargraph::Range]
13
- attr_reader :range
14
-
15
- # @param pins [Array<Solargraph::Pin::Base>]
16
- # @param range [Solargraph::Range]
17
- def initialize pins, range
18
- @pins = pins
19
- @range = range
20
- end
21
- end
22
- end
23
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class SourceMap
5
+ # The result of a completion request containing the pins that describe
6
+ # completion options and the range to be replaced.
7
+ #
8
+ class Completion
9
+ # @return [Array<Solargraph::Pin::Base>]
10
+ attr_reader :pins
11
+
12
+ # @return [Solargraph::Range]
13
+ attr_reader :range
14
+
15
+ # @param pins [Array<Solargraph::Pin::Base>]
16
+ # @param range [Solargraph::Range]
17
+ def initialize pins, range
18
+ @pins = pins
19
+ @range = range
20
+ end
21
+ end
22
+ end
23
+ end