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,27 +1,27 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
-
5
- module Solargraph
6
- # A container of source maps and workspace data to be cataloged in an ApiMap.
7
- #
8
- class Bench
9
- # @return [Set<SourceMap>]
10
- attr_reader :source_maps
11
-
12
- # @return [Workspace]
13
- attr_reader :workspace
14
-
15
- # @return [Set<String>]
16
- attr_reader :external_requires
17
-
18
- # @param source_maps [Array<SourceMap>, Set<SourceMap>]
19
- # @param workspace [Workspace]
20
- # @param external_requires [Array<String>, Set<String>]
21
- def initialize source_maps: [], workspace: Workspace.new, external_requires: []
22
- @source_maps = source_maps.to_set
23
- @workspace = workspace
24
- @external_requires = external_requires.to_set
25
- end
26
- end
27
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Solargraph
6
+ # A container of source maps and workspace data to be cataloged in an ApiMap.
7
+ #
8
+ class Bench
9
+ # @return [Set<SourceMap>]
10
+ attr_reader :source_maps
11
+
12
+ # @return [Workspace]
13
+ attr_reader :workspace
14
+
15
+ # @return [Set<String>]
16
+ attr_reader :external_requires
17
+
18
+ # @param source_maps [Array<SourceMap>, Set<SourceMap>]
19
+ # @param workspace [Workspace]
20
+ # @param external_requires [Array<String>, Set<String>]
21
+ def initialize source_maps: [], workspace: Workspace.new, external_requires: []
22
+ @source_maps = source_maps.to_set
23
+ @workspace = workspace
24
+ @external_requires = external_requires.to_set
25
+ end
26
+ end
27
+ end
@@ -1,37 +1,37 @@
1
- unless Hash.method_defined?(:transform_keys)
2
- class Hash
3
- def transform_keys &block
4
- result = {}
5
- each_pair do |k, v|
6
- result[block.call(k)] = v
7
- end
8
- result
9
- end
10
- end
11
- end
12
-
13
- unless Hash.method_defined?(:transform_values)
14
- class Hash
15
- def transform_values &block
16
- result = {}
17
- each_pair do |k, v|
18
- result[k] = block.call(v)
19
- end
20
- result
21
- end
22
- end
23
- end
24
-
25
- unless Array.method_defined?(:sum)
26
- class Array
27
- def sum &block
28
- inject(0) do |s, x|
29
- if block
30
- s + block.call(x)
31
- else
32
- s + x
33
- end
34
- end
35
- end
36
- end
37
- end
1
+ unless Hash.method_defined?(:transform_keys)
2
+ class Hash
3
+ def transform_keys &block
4
+ result = {}
5
+ each_pair do |k, v|
6
+ result[block.call(k)] = v
7
+ end
8
+ result
9
+ end
10
+ end
11
+ end
12
+
13
+ unless Hash.method_defined?(:transform_values)
14
+ class Hash
15
+ def transform_values &block
16
+ result = {}
17
+ each_pair do |k, v|
18
+ result[k] = block.call(v)
19
+ end
20
+ result
21
+ end
22
+ end
23
+ end
24
+
25
+ unless Array.method_defined?(:sum)
26
+ class Array
27
+ def sum &block
28
+ inject(0) do |s, x|
29
+ if block
30
+ s + block.call(x)
31
+ else
32
+ s + x
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,130 +1,130 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ComplexType
5
- # Methods for accessing type data.
6
- #
7
- module TypeMethods
8
- # @return [String]
9
- attr_reader :name
10
-
11
- # @return [String]
12
- attr_reader :substring
13
-
14
- # @return [String]
15
- attr_reader :tag
16
-
17
- # @return [Array<ComplexType>]
18
- attr_reader :subtypes
19
-
20
- # @return [Boolean]
21
- def duck_type?
22
- @duck_type ||= name.start_with?('#')
23
- end
24
-
25
- # @return [Boolean]
26
- def nil_type?
27
- @nil_type = (name.casecmp('nil') == 0) if @nil_type.nil?
28
- @nil_type
29
- end
30
-
31
- # @return [Boolean]
32
- def parameters?
33
- !substring.empty?
34
- end
35
-
36
- def void?
37
- name == 'void'
38
- end
39
-
40
- def defined?
41
- !undefined?
42
- end
43
-
44
- def undefined?
45
- name == 'undefined'
46
- end
47
-
48
- # @return [Boolean]
49
- def list_parameters?
50
- substring.start_with?('<')
51
- end
52
-
53
- # @return [Boolean]
54
- def fixed_parameters?
55
- substring.start_with?('(')
56
- end
57
-
58
- # @return [Boolean]
59
- def hash_parameters?
60
- substring.start_with?('{')
61
- end
62
-
63
- # @return [Array<ComplexType>]
64
- def value_types
65
- @subtypes
66
- end
67
-
68
- # @return [Array<ComplexType>]
69
- def key_types
70
- @key_types
71
- end
72
-
73
- # @return [String]
74
- def namespace
75
- # if priority higher than ||=, old implements cause unnecessary check
76
- @namespace ||= lambda do
77
- return 'Object' if duck_type?
78
- return 'NilClass' if nil_type?
79
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
80
- end.call
81
- end
82
-
83
- # @return [Symbol] :class or :instance
84
- def scope
85
- @scope ||= :instance if duck_type? || nil_type?
86
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
87
- end
88
-
89
- def == other
90
- return false unless self.class == other.class
91
- tag == other.tag
92
- end
93
-
94
- def rooted?
95
- @rooted
96
- end
97
-
98
- # Generate a ComplexType that fully qualifies this type's namespaces.
99
- #
100
- # @param api_map [ApiMap] The ApiMap that performs qualification
101
- # @param context [String] The namespace from which to resolve names
102
- # @return [ComplexType] The generated ComplexType
103
- def qualify api_map, context = ''
104
- return ComplexType.new([self]) if duck_type? || void? || undefined?
105
- recon = (rooted? ? '' : context)
106
- fqns = api_map.qualify(name, recon)
107
- if fqns.nil?
108
- return UniqueType::BOOLEAN if tag == 'Boolean'
109
- return UniqueType::UNDEFINED
110
- end
111
- fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
112
- ltypes = key_types.map do |t|
113
- t.qualify api_map, context
114
- end
115
- rtypes = value_types.map do |t|
116
- t.qualify api_map, context
117
- end
118
- if list_parameters?
119
- Solargraph::ComplexType.parse("#{fqns}<#{rtypes.map(&:tag).join(', ')}>")
120
- elsif fixed_parameters?
121
- Solargraph::ComplexType.parse("#{fqns}(#{rtypes.map(&:tag).join(', ')})")
122
- elsif hash_parameters?
123
- Solargraph::ComplexType.parse("#{fqns}{#{ltypes.map(&:tag).join(', ')} => #{rtypes.map(&:tag).join(', ')}}")
124
- else
125
- Solargraph::ComplexType.parse(fqns)
126
- end
127
- end
128
- end
129
- end
130
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ComplexType
5
+ # Methods for accessing type data.
6
+ #
7
+ module TypeMethods
8
+ # @return [String]
9
+ attr_reader :name
10
+
11
+ # @return [String]
12
+ attr_reader :substring
13
+
14
+ # @return [String]
15
+ attr_reader :tag
16
+
17
+ # @return [Array<ComplexType>]
18
+ attr_reader :subtypes
19
+
20
+ # @return [Boolean]
21
+ def duck_type?
22
+ @duck_type ||= name.start_with?('#')
23
+ end
24
+
25
+ # @return [Boolean]
26
+ def nil_type?
27
+ @nil_type = (name.casecmp('nil') == 0) if @nil_type.nil?
28
+ @nil_type
29
+ end
30
+
31
+ # @return [Boolean]
32
+ def parameters?
33
+ !substring.empty?
34
+ end
35
+
36
+ def void?
37
+ name == 'void'
38
+ end
39
+
40
+ def defined?
41
+ !undefined?
42
+ end
43
+
44
+ def undefined?
45
+ name == 'undefined'
46
+ end
47
+
48
+ # @return [Boolean]
49
+ def list_parameters?
50
+ substring.start_with?('<')
51
+ end
52
+
53
+ # @return [Boolean]
54
+ def fixed_parameters?
55
+ substring.start_with?('(')
56
+ end
57
+
58
+ # @return [Boolean]
59
+ def hash_parameters?
60
+ substring.start_with?('{')
61
+ end
62
+
63
+ # @return [Array<ComplexType>]
64
+ def value_types
65
+ @subtypes
66
+ end
67
+
68
+ # @return [Array<ComplexType>]
69
+ def key_types
70
+ @key_types
71
+ end
72
+
73
+ # @return [String]
74
+ def namespace
75
+ # if priority higher than ||=, old implements cause unnecessary check
76
+ @namespace ||= lambda do
77
+ return 'Object' if duck_type?
78
+ return 'NilClass' if nil_type?
79
+ return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
80
+ end.call
81
+ end
82
+
83
+ # @return [Symbol] :class or :instance
84
+ def scope
85
+ @scope ||= :instance if duck_type? || nil_type?
86
+ @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
87
+ end
88
+
89
+ def == other
90
+ return false unless self.class == other.class
91
+ tag == other.tag
92
+ end
93
+
94
+ def rooted?
95
+ @rooted
96
+ end
97
+
98
+ # Generate a ComplexType that fully qualifies this type's namespaces.
99
+ #
100
+ # @param api_map [ApiMap] The ApiMap that performs qualification
101
+ # @param context [String] The namespace from which to resolve names
102
+ # @return [ComplexType] The generated ComplexType
103
+ def qualify api_map, context = ''
104
+ return ComplexType.new([self]) if duck_type? || void? || undefined?
105
+ recon = (rooted? ? '' : context)
106
+ fqns = api_map.qualify(name, recon)
107
+ if fqns.nil?
108
+ return UniqueType::BOOLEAN if tag == 'Boolean'
109
+ return UniqueType::UNDEFINED
110
+ end
111
+ fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
112
+ ltypes = key_types.map do |t|
113
+ t.qualify api_map, context
114
+ end
115
+ rtypes = value_types.map do |t|
116
+ t.qualify api_map, context
117
+ end
118
+ if list_parameters?
119
+ Solargraph::ComplexType.parse("#{fqns}<#{rtypes.map(&:tag).join(', ')}>")
120
+ elsif fixed_parameters?
121
+ Solargraph::ComplexType.parse("#{fqns}(#{rtypes.map(&:tag).join(', ')})")
122
+ elsif hash_parameters?
123
+ Solargraph::ComplexType.parse("#{fqns}{#{ltypes.map(&:tag).join(', ')} => #{rtypes.map(&:tag).join(', ')}}")
124
+ else
125
+ Solargraph::ComplexType.parse(fqns)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -1,75 +1,75 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ComplexType
5
- # An individual type signature. A complex type can consist of multiple
6
- # unique types.
7
- #
8
- class UniqueType
9
- include TypeMethods
10
-
11
- # Create a UniqueType with the specified name and an optional substring.
12
- # The substring is the parameter section of a parametrized type, e.g.,
13
- # for the type `Array<String>`, the name is `Array` and the substring is
14
- # `<String>`.
15
- #
16
- # @param name [String] The name of the type
17
- # @param substring [String] The substring of the type
18
- def initialize name, substring = ''
19
- if name.start_with?('::')
20
- @name = name[2..-1]
21
- @rooted = true
22
- else
23
- @name = name
24
- @rooted = false
25
- end
26
- @substring = substring
27
- @tag = @name + substring
28
- @key_types = []
29
- @subtypes = []
30
- return unless parameters?
31
- if @substring.start_with?('<(') && @substring.end_with?(')>')
32
- subs = ComplexType.parse(substring[2..-3], partial: true)
33
- else
34
- subs = ComplexType.parse(substring[1..-2], partial: true)
35
- end
36
- if hash_parameters?
37
- raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(UniqueType) and !subs[1].is_a?(UniqueType)
38
- @key_types.concat subs[0].map { |u| ComplexType.new([u]) }
39
- @subtypes.concat subs[1].map { |u| ComplexType.new([u]) }
40
- else
41
- @subtypes.concat subs
42
- end
43
- end
44
-
45
- def to_s
46
- tag
47
- end
48
-
49
- def self_to dst
50
- return self unless selfy?
51
- new_name = (@name == 'self' ? dst : @name)
52
- new_key_types = @key_types.map { |t| t.self_to dst }
53
- new_subtypes = @subtypes.map { |t| t.self_to dst }
54
- if hash_parameters?
55
- UniqueType.new(new_name, "{#{new_key_types.join(', ')} => #{new_subtypes.join(', ')}}")
56
- elsif parameters?
57
- if @substring.start_with?'<('
58
- UniqueType.new(new_name, "<(#{new_subtypes.join(', ')})>")
59
- else
60
- UniqueType.new(new_name, "<#{new_subtypes.join(', ')}>")
61
- end
62
- else
63
- UniqueType.new(new_name)
64
- end
65
- end
66
-
67
- def selfy?
68
- @name == 'self' || @key_types.any?(&:selfy?) || @subtypes.any?(&:selfy?)
69
- end
70
-
71
- UNDEFINED = UniqueType.new('undefined')
72
- BOOLEAN = UniqueType.new('Boolean')
73
- end
74
- end
75
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ComplexType
5
+ # An individual type signature. A complex type can consist of multiple
6
+ # unique types.
7
+ #
8
+ class UniqueType
9
+ include TypeMethods
10
+
11
+ # Create a UniqueType with the specified name and an optional substring.
12
+ # The substring is the parameter section of a parametrized type, e.g.,
13
+ # for the type `Array<String>`, the name is `Array` and the substring is
14
+ # `<String>`.
15
+ #
16
+ # @param name [String] The name of the type
17
+ # @param substring [String] The substring of the type
18
+ def initialize name, substring = ''
19
+ if name.start_with?('::')
20
+ @name = name[2..-1]
21
+ @rooted = true
22
+ else
23
+ @name = name
24
+ @rooted = false
25
+ end
26
+ @substring = substring
27
+ @tag = @name + substring
28
+ @key_types = []
29
+ @subtypes = []
30
+ return unless parameters?
31
+ if @substring.start_with?('<(') && @substring.end_with?(')>')
32
+ subs = ComplexType.parse(substring[2..-3], partial: true)
33
+ else
34
+ subs = ComplexType.parse(substring[1..-2], partial: true)
35
+ end
36
+ if hash_parameters?
37
+ raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(UniqueType) and !subs[1].is_a?(UniqueType)
38
+ @key_types.concat subs[0].map { |u| ComplexType.new([u]) }
39
+ @subtypes.concat subs[1].map { |u| ComplexType.new([u]) }
40
+ else
41
+ @subtypes.concat subs
42
+ end
43
+ end
44
+
45
+ def to_s
46
+ tag
47
+ end
48
+
49
+ def self_to dst
50
+ return self unless selfy?
51
+ new_name = (@name == 'self' ? dst : @name)
52
+ new_key_types = @key_types.map { |t| t.self_to dst }
53
+ new_subtypes = @subtypes.map { |t| t.self_to dst }
54
+ if hash_parameters?
55
+ UniqueType.new(new_name, "{#{new_key_types.join(', ')} => #{new_subtypes.join(', ')}}")
56
+ elsif parameters?
57
+ if @substring.start_with?'<('
58
+ UniqueType.new(new_name, "<(#{new_subtypes.join(', ')})>")
59
+ else
60
+ UniqueType.new(new_name, "<#{new_subtypes.join(', ')}>")
61
+ end
62
+ else
63
+ UniqueType.new(new_name)
64
+ end
65
+ end
66
+
67
+ def selfy?
68
+ @name == 'self' || @key_types.any?(&:selfy?) || @subtypes.any?(&:selfy?)
69
+ end
70
+
71
+ UNDEFINED = UniqueType.new('undefined')
72
+ BOOLEAN = UniqueType.new('Boolean')
73
+ end
74
+ end
75
+ end