solargraph 0.54.4 → 0.58.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) 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 +185 -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 +143 -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 +45 -28
  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/gemfile.rb +15 -15
  33. data/lib/solargraph/convention/gemspec.rb +23 -22
  34. data/lib/solargraph/convention/rakefile.rb +17 -17
  35. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  36. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  37. data/lib/solargraph/convention/struct_definition.rb +164 -0
  38. data/lib/solargraph/convention.rb +78 -47
  39. data/lib/solargraph/converters/dd.rb +17 -17
  40. data/lib/solargraph/converters/dl.rb +15 -15
  41. data/lib/solargraph/converters/dt.rb +15 -15
  42. data/lib/solargraph/converters/misc.rb +1 -1
  43. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  44. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  45. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  46. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  47. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  48. data/lib/solargraph/doc_map.rb +439 -188
  49. data/lib/solargraph/environ.rb +9 -2
  50. data/lib/solargraph/equality.rb +34 -33
  51. data/lib/solargraph/gem_pins.rb +98 -72
  52. data/lib/solargraph/language_server/error_codes.rb +20 -20
  53. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  54. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  55. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  56. data/lib/solargraph/language_server/host/sources.rb +99 -99
  57. data/lib/solargraph/language_server/host.rb +878 -861
  58. data/lib/solargraph/language_server/message/base.rb +97 -96
  59. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  62. data/lib/solargraph/language_server/message/extended/document.rb +23 -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 -19
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  66. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  67. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  68. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  69. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  71. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  72. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  73. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  74. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  75. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  76. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  77. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  78. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  79. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  80. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
  81. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  82. data/lib/solargraph/language_server/message.rb +94 -94
  83. data/lib/solargraph/language_server/progress.rb +8 -0
  84. data/lib/solargraph/language_server/request.rb +27 -24
  85. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  86. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  87. data/lib/solargraph/library.rb +683 -662
  88. data/lib/solargraph/location.rb +82 -58
  89. data/lib/solargraph/logging.rb +37 -27
  90. data/lib/solargraph/page.rb +92 -89
  91. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  92. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  93. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  94. data/lib/solargraph/parser/node_processor.rb +62 -45
  95. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  96. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
  97. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  98. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  99. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  100. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  102. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  103. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  104. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  107. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
  108. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  109. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  111. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  112. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  113. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  114. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  115. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  116. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  117. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  118. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  119. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  120. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  121. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  122. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  123. data/lib/solargraph/parser/parser_gem.rb +12 -12
  124. data/lib/solargraph/parser/region.rb +69 -66
  125. data/lib/solargraph/parser/snippet.rb +17 -15
  126. data/lib/solargraph/parser.rb +23 -22
  127. data/lib/solargraph/pin/base.rb +729 -378
  128. data/lib/solargraph/pin/base_variable.rb +126 -118
  129. data/lib/solargraph/pin/block.rb +104 -101
  130. data/lib/solargraph/pin/breakable.rb +9 -0
  131. data/lib/solargraph/pin/callable.rb +231 -147
  132. data/lib/solargraph/pin/closure.rb +72 -57
  133. data/lib/solargraph/pin/common.rb +79 -70
  134. data/lib/solargraph/pin/constant.rb +45 -43
  135. data/lib/solargraph/pin/conversions.rb +123 -123
  136. data/lib/solargraph/pin/delegated_method.rb +120 -101
  137. data/lib/solargraph/pin/documenting.rb +114 -98
  138. data/lib/solargraph/pin/instance_variable.rb +34 -34
  139. data/lib/solargraph/pin/keyword.rb +20 -15
  140. data/lib/solargraph/pin/local_variable.rb +75 -67
  141. data/lib/solargraph/pin/method.rb +672 -527
  142. data/lib/solargraph/pin/method_alias.rb +34 -31
  143. data/lib/solargraph/pin/namespace.rb +115 -107
  144. data/lib/solargraph/pin/parameter.rb +275 -212
  145. data/lib/solargraph/pin/proxy_type.rb +39 -29
  146. data/lib/solargraph/pin/reference/override.rb +47 -29
  147. data/lib/solargraph/pin/reference/require.rb +2 -2
  148. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  149. data/lib/solargraph/pin/reference.rb +39 -22
  150. data/lib/solargraph/pin/search.rb +61 -56
  151. data/lib/solargraph/pin/signature.rb +61 -17
  152. data/lib/solargraph/pin/singleton.rb +1 -1
  153. data/lib/solargraph/pin/symbol.rb +53 -47
  154. data/lib/solargraph/pin/until.rb +18 -0
  155. data/lib/solargraph/pin/while.rb +18 -0
  156. data/lib/solargraph/pin.rb +44 -41
  157. data/lib/solargraph/pin_cache.rb +245 -0
  158. data/lib/solargraph/position.rb +132 -107
  159. data/lib/solargraph/range.rb +112 -98
  160. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  161. data/lib/solargraph/rbs_map/core_fills.rb +84 -50
  162. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  163. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  164. data/lib/solargraph/rbs_map.rb +163 -93
  165. data/lib/solargraph/server_methods.rb +16 -16
  166. data/lib/solargraph/shell.rb +363 -269
  167. data/lib/solargraph/source/chain/array.rb +37 -33
  168. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  169. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  170. data/lib/solargraph/source/chain/call.rb +337 -303
  171. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  172. data/lib/solargraph/source/chain/constant.rb +26 -89
  173. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  174. data/lib/solargraph/source/chain/hash.rb +34 -33
  175. data/lib/solargraph/source/chain/head.rb +1 -1
  176. data/lib/solargraph/source/chain/if.rb +28 -28
  177. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/link.rb +109 -98
  179. data/lib/solargraph/source/chain/literal.rb +48 -28
  180. data/lib/solargraph/source/chain/or.rb +23 -23
  181. data/lib/solargraph/source/chain/q_call.rb +11 -11
  182. data/lib/solargraph/source/chain/variable.rb +13 -13
  183. data/lib/solargraph/source/chain/z_super.rb +30 -30
  184. data/lib/solargraph/source/chain.rb +291 -252
  185. data/lib/solargraph/source/change.rb +82 -82
  186. data/lib/solargraph/source/cursor.rb +166 -167
  187. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  188. data/lib/solargraph/source/source_chainer.rb +194 -194
  189. data/lib/solargraph/source/updater.rb +55 -55
  190. data/lib/solargraph/source.rb +498 -495
  191. data/lib/solargraph/source_map/clip.rb +226 -232
  192. data/lib/solargraph/source_map/data.rb +34 -30
  193. data/lib/solargraph/source_map/mapper.rb +259 -255
  194. data/lib/solargraph/source_map.rb +212 -217
  195. data/lib/solargraph/type_checker/checks.rb +124 -120
  196. data/lib/solargraph/type_checker/param_def.rb +37 -35
  197. data/lib/solargraph/type_checker/problem.rb +32 -32
  198. data/lib/solargraph/type_checker/rules.rb +84 -62
  199. data/lib/solargraph/type_checker.rb +814 -672
  200. data/lib/solargraph/version.rb +5 -5
  201. data/lib/solargraph/views/_method.erb +10 -10
  202. data/lib/solargraph/views/_namespace.erb +3 -3
  203. data/lib/solargraph/views/document.erb +10 -10
  204. data/lib/solargraph/workspace/config.rb +255 -239
  205. data/lib/solargraph/workspace/require_paths.rb +97 -0
  206. data/lib/solargraph/workspace.rb +220 -239
  207. data/lib/solargraph/yard_map/helpers.rb +44 -16
  208. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  209. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  210. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  211. data/lib/solargraph/yard_map/mapper.rb +79 -78
  212. data/lib/solargraph/yard_map/to_method.rb +89 -86
  213. data/lib/solargraph/yard_tags.rb +20 -20
  214. data/lib/solargraph/yardoc.rb +87 -52
  215. data/lib/solargraph.rb +105 -72
  216. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  217. data/rbs/fills/open3/0/open3.rbs +172 -0
  218. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  219. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  220. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  221. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  222. data/rbs/fills/tuple/tuple.rbs +149 -0
  223. data/rbs/shims/ast/0/node.rbs +5 -0
  224. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  225. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  226. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  227. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  228. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  229. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  230. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  231. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  232. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  233. data/rbs_collection.yaml +19 -0
  234. data/solargraph.gemspec +27 -5
  235. metadata +215 -18
  236. data/lib/.rubocop.yml +0 -22
  237. data/lib/solargraph/cache.rb +0 -77
  238. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,28 +1,45 @@
1
- # frozen_string_literal: true
2
-
3
-
4
- module Solargraph
5
- # A container of source maps and workspace data to be cataloged in an ApiMap.
6
- #
7
- class Bench
8
- # @return [Set<SourceMap>]
9
- attr_reader :source_maps
10
-
11
- # @return [Workspace]
12
- attr_reader :workspace
13
-
14
- # @return [Set<String>]
15
- attr_reader :external_requires
16
-
17
- # @param source_maps [Array<SourceMap>, Set<SourceMap>]
18
- # @param workspace [Workspace]
19
- # @param external_requires [Array<String>, Set<String>]
20
- def initialize source_maps: [], workspace: Workspace.new, external_requires: []
21
- @source_maps = source_maps.to_set
22
- @workspace = workspace
23
- @external_requires = external_requires.reject { |path| workspace.would_require?(path) }
24
- .compact
25
- .to_set
26
- end
27
- end
28
- end
1
+ # frozen_string_literal: true
2
+
3
+
4
+ module Solargraph
5
+ # A container of source maps and workspace data to be cataloged in an ApiMap.
6
+ #
7
+ class Bench
8
+ # @return [Set<SourceMap>]
9
+ attr_reader :source_maps
10
+
11
+ # @return [Workspace]
12
+ attr_reader :workspace
13
+
14
+ # @return [SourceMap]
15
+ attr_reader :live_map
16
+
17
+ # @return [Set<String>]
18
+ attr_reader :external_requires
19
+
20
+ # @param source_maps [Array<SourceMap>, Set<SourceMap>]
21
+ # @param workspace [Workspace]
22
+ # @param live_map [SourceMap, nil]
23
+ # @param external_requires [Array<String>, Set<String>]
24
+ def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
25
+ @source_maps = source_maps.to_set
26
+ @workspace = workspace
27
+ @live_map = live_map
28
+ @external_requires = external_requires.reject { |path| workspace.would_require?(path) }
29
+ .compact
30
+ .to_set
31
+ end
32
+
33
+ # @return [Hash{String => SourceMap}]
34
+ def source_map_hash
35
+ # @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
36
+ @source_map_hash ||= source_maps.map { |s| [s.filename, s] }
37
+ .to_h
38
+ end
39
+
40
+ # @return [Set<SourceMap>]
41
+ def icebox
42
+ @icebox ||= (source_maps - [live_map])
43
+ end
44
+ end
45
+ end
@@ -1,217 +1,228 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ComplexType
5
- # Methods for accessing type data available from
6
- # both ComplexType and UniqueType.
7
- #
8
- # @abstract This mixin relies on these -
9
- # instance variables:
10
- # @name: String
11
- # @subtypes: Array<ComplexType>
12
- # @rooted: boolish
13
- # methods:
14
- # transform()
15
- # all_params()
16
- # rooted?()
17
- # can_root_name?()
18
- module TypeMethods
19
- # @!method transform(new_name = nil, &transform_type)
20
- # @param new_name [String, nil]
21
- # @yieldparam t [UniqueType]
22
- # @yieldreturn [UniqueType]
23
- # @return [UniqueType, nil]
24
- # @!method all_params
25
- # @return [Array<ComplexType>]
26
- # @!method rooted?
27
- # @!method can_root_name?(name_to_check = nil)
28
- # @param name_to_check [String, nil]
29
-
30
- # @return [String]
31
- attr_reader :name
32
-
33
- # @return [Array<ComplexType>]
34
- attr_reader :subtypes
35
-
36
- # @return [String]
37
- def tag
38
- @tag ||= "#{name}#{substring}"
39
- end
40
-
41
- # @return [String]
42
- def rooted_tag
43
- @rooted_tag ||= rooted_name + rooted_substring
44
- end
45
-
46
- # @return [Boolean]
47
- def duck_type?
48
- @duck_type ||= name.start_with?('#')
49
- end
50
-
51
- # @return [Boolean]
52
- def nil_type?
53
- @nil_type ||= (name.casecmp('nil') == 0)
54
- end
55
-
56
- def tuple?
57
- @tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
58
- end
59
-
60
- def void?
61
- name == 'void'
62
- end
63
-
64
- def defined?
65
- !undefined?
66
- end
67
-
68
- def undefined?
69
- name == 'undefined'
70
- end
71
-
72
- # @param generics_to_erase [Enumerable<String>]
73
- # @return [self]
74
- def erase_generics(generics_to_erase)
75
- transform do |type|
76
- if type.name == ComplexType::GENERIC_TAG_NAME
77
- if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
78
- ComplexType::UNDEFINED
79
- else
80
- type
81
- end
82
- else
83
- type
84
- end
85
- end
86
- end
87
-
88
- # @return [Symbol, nil]
89
- attr_reader :parameters_type
90
-
91
- PARAMETERS_TYPE_BY_STARTING_TAG = {
92
- '{' => :hash,
93
- '(' => :fixed,
94
- '<' => :list
95
- }.freeze
96
-
97
- # @return [Boolean]
98
- def list_parameters?
99
- parameters_type == :list
100
- end
101
-
102
- # @return [Boolean]
103
- def fixed_parameters?
104
- parameters_type == :fixed
105
- end
106
-
107
- # @return [Boolean]
108
- def hash_parameters?
109
- parameters_type == :hash
110
- end
111
-
112
- # @return [Array<ComplexType>]
113
- def value_types
114
- @subtypes
115
- end
116
-
117
- # @return [Array<ComplexType>]
118
- def key_types
119
- @key_types
120
- end
121
-
122
- # @return [String]
123
- def namespace
124
- # if priority higher than ||=, old implements cause unnecessary check
125
- @namespace ||= lambda do
126
- return 'Object' if duck_type?
127
- return 'NilClass' if nil_type?
128
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
129
- end.call
130
- end
131
-
132
- def namespace_type
133
- return ComplexType.parse('::Object') if duck_type?
134
- return ComplexType.parse('::NilClass') if nil_type?
135
- return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
136
- self
137
- end
138
-
139
- # @return [String]
140
- def rooted_namespace
141
- return namespace unless rooted? && can_root_name?(namespace)
142
- "::#{namespace}"
143
- end
144
-
145
- # @return [String]
146
- def rooted_name
147
- return name unless @rooted && can_root_name?
148
- "::#{name}"
149
- end
150
-
151
- # @return [String]
152
- def substring
153
- @substring ||= generate_substring_from(&:tags)
154
- end
155
-
156
- # @return [String]
157
- def rooted_substring
158
- @rooted_substring = generate_substring_from(&:rooted_tags)
159
- end
160
-
161
- # @return [String]
162
- def generate_substring_from(&to_str)
163
- key_types_str = key_types.map(&to_str).join(', ')
164
- subtypes_str = subtypes.map(&to_str).join(', ')
165
- if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
166
- ''
167
- elsif key_types.empty? && subtypes.empty?
168
- ''
169
- elsif hash_parameters?
170
- "{#{key_types_str} => #{subtypes_str}}"
171
- elsif fixed_parameters?
172
- "(#{subtypes_str})"
173
- else
174
- "<#{subtypes_str}>"
175
- end
176
- end
177
-
178
- # @return [::Symbol] :class or :instance
179
- def scope
180
- @scope ||= :instance if duck_type? || nil_type?
181
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
182
- end
183
-
184
- # @param other [Object]
185
- def == other
186
- return false unless self.class == other.class
187
- tag == other.tag
188
- end
189
-
190
- # Generate a ComplexType that fully qualifies this type's namespaces.
191
- #
192
- # @param api_map [ApiMap] The ApiMap that performs qualification
193
- # @param context [String] The namespace from which to resolve names
194
- # @return [self, ComplexType, UniqueType] The generated ComplexType
195
- def qualify api_map, context = ''
196
- transform do |t|
197
- next t if t.name == GENERIC_TAG_NAME
198
- next t if t.duck_type? || t.void? || t.undefined?
199
- recon = (t.rooted? ? '' : context)
200
- fqns = api_map.qualify(t.name, recon)
201
- if fqns.nil?
202
- next UniqueType::BOOLEAN if t.tag == 'Boolean'
203
- next UniqueType::UNDEFINED
204
- end
205
- t.recreate(new_name: fqns, make_rooted: true)
206
- end
207
- end
208
-
209
- # @yieldparam [UniqueType]
210
- # @return [Enumerator<UniqueType>]
211
- def each_unique_type &block
212
- return enum_for(__method__) unless block_given?
213
- yield self
214
- end
215
- end
216
- end
217
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ComplexType
5
+ # Methods for accessing type data available from
6
+ # both ComplexType and UniqueType.
7
+ #
8
+ # @abstract This mixin relies on these -
9
+ # instance variables:
10
+ # @name: String
11
+ # @subtypes: Array<ComplexType>
12
+ # @rooted: boolish
13
+ # methods:
14
+ # transform()
15
+ # all_params()
16
+ # rooted?()
17
+ # can_root_name?()
18
+ module TypeMethods
19
+ # @!method transform(new_name = nil, &transform_type)
20
+ # @param new_name [String, nil]
21
+ # @yieldparam t [UniqueType]
22
+ # @yieldreturn [UniqueType]
23
+ # @return [UniqueType, nil]
24
+ # @!method all_params
25
+ # @return [Array<ComplexType>]
26
+ # @!method rooted?
27
+ # @!method can_root_name?(name_to_check = nil)
28
+ # @param name_to_check [String, nil]
29
+
30
+ # @return [String]
31
+ attr_reader :name
32
+
33
+ # @return [Array<ComplexType>]
34
+ attr_reader :subtypes
35
+
36
+ # @return [String]
37
+ def tag
38
+ @tag ||= "#{name}#{substring}"
39
+ end
40
+
41
+ # @return [String]
42
+ def rooted_tag
43
+ @rooted_tag ||= rooted_name + rooted_substring
44
+ end
45
+
46
+ def interface?
47
+ name.start_with?('_')
48
+ end
49
+
50
+ # @return [Boolean]
51
+ def duck_type?
52
+ @duck_type ||= name.start_with?('#')
53
+ end
54
+
55
+ # @return [Boolean]
56
+ def nil_type?
57
+ @nil_type ||= (name.casecmp('nil') == 0)
58
+ end
59
+
60
+ def tuple?
61
+ @tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
62
+ end
63
+
64
+ def void?
65
+ name == 'void'
66
+ end
67
+
68
+ def defined?
69
+ !undefined?
70
+ end
71
+
72
+ def undefined?
73
+ name == 'undefined'
74
+ end
75
+
76
+ # @param generics_to_erase [Enumerable<String>]
77
+ # @return [self]
78
+ def erase_generics(generics_to_erase)
79
+ transform do |type|
80
+ if type.name == ComplexType::GENERIC_TAG_NAME
81
+ if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
82
+ ComplexType::UNDEFINED
83
+ else
84
+ type
85
+ end
86
+ else
87
+ type
88
+ end
89
+ end
90
+ end
91
+
92
+ # @return [Symbol, nil]
93
+ attr_reader :parameters_type
94
+
95
+ # @type [Hash{String => Symbol}]
96
+ PARAMETERS_TYPE_BY_STARTING_TAG = {
97
+ '{' => :hash,
98
+ '(' => :fixed,
99
+ '<' => :list
100
+ }.freeze
101
+
102
+ # @return [Boolean]
103
+ def list_parameters?
104
+ parameters_type == :list
105
+ end
106
+
107
+ # @return [Boolean]
108
+ def fixed_parameters?
109
+ parameters_type == :fixed
110
+ end
111
+
112
+ # @return [Boolean]
113
+ def hash_parameters?
114
+ parameters_type == :hash
115
+ end
116
+
117
+ # @return [Array<ComplexType>]
118
+ def value_types
119
+ @subtypes
120
+ end
121
+
122
+ # @return [Array<ComplexType>]
123
+ def key_types
124
+ @key_types
125
+ end
126
+
127
+ # @return [String]
128
+ def namespace
129
+ # if priority higher than ||=, old implements cause unnecessary check
130
+ @namespace ||= lambda do
131
+ return 'Object' if duck_type?
132
+ return 'NilClass' if nil_type?
133
+ return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
134
+ end.call
135
+ end
136
+
137
+ # @return [self]
138
+ def namespace_type
139
+ return ComplexType.parse('::Object') if duck_type?
140
+ return ComplexType.parse('::NilClass') if nil_type?
141
+ return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
142
+ self
143
+ end
144
+
145
+ # @return [String]
146
+ def rooted_namespace
147
+ return namespace unless rooted? && can_root_name?(namespace)
148
+ "::#{namespace}"
149
+ end
150
+
151
+ # @return [String]
152
+ def rooted_name
153
+ return name unless @rooted && can_root_name?
154
+ "::#{name}"
155
+ end
156
+
157
+ # @return [String]
158
+ def substring
159
+ @substring ||= generate_substring_from(&:tags)
160
+ end
161
+
162
+ # @return [String]
163
+ def rooted_substring
164
+ @rooted_substring = generate_substring_from(&:rooted_tags)
165
+ end
166
+
167
+ # @return [String]
168
+ def generate_substring_from(&to_str)
169
+ key_types_str = key_types.map(&to_str).join(', ')
170
+ subtypes_str = subtypes.map(&to_str).join(', ')
171
+ if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
172
+ ''
173
+ elsif key_types.empty? && subtypes.empty?
174
+ ''
175
+ elsif hash_parameters?
176
+ "{#{key_types_str} => #{subtypes_str}}"
177
+ elsif fixed_parameters?
178
+ "(#{subtypes_str})"
179
+ else
180
+ if name == 'Hash'
181
+ "<#{key_types_str}, #{subtypes_str}>"
182
+ else
183
+ "<#{key_types_str}#{subtypes_str}>"
184
+ end
185
+ end
186
+ end
187
+
188
+ # @return [::Symbol] :class or :instance
189
+ def scope
190
+ @scope ||= :instance if duck_type? || nil_type?
191
+ @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
192
+ end
193
+
194
+ # @param other [Object]
195
+ def == other
196
+ return false unless self.class == other.class
197
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
198
+ tag == other.tag
199
+ end
200
+
201
+ # Generate a ComplexType that fully qualifies this type's namespaces.
202
+ #
203
+ # @param api_map [ApiMap] The ApiMap that performs qualification
204
+ # @param context [String] The namespace from which to resolve names
205
+ # @return [self, ComplexType, UniqueType] The generated ComplexType
206
+ def qualify api_map, context = ''
207
+ transform do |t|
208
+ next t if t.name == GENERIC_TAG_NAME
209
+ next t if t.duck_type? || t.void? || t.undefined?
210
+ recon = (t.rooted? ? '' : context)
211
+ fqns = api_map.qualify(t.name, recon)
212
+ if fqns.nil?
213
+ next UniqueType::BOOLEAN if t.tag == 'Boolean'
214
+ next UniqueType::UNDEFINED
215
+ end
216
+ t.recreate(new_name: fqns, make_rooted: true)
217
+ end
218
+ end
219
+
220
+ # @yieldparam [UniqueType]
221
+ # @return [Enumerator<UniqueType>]
222
+ def each_unique_type &block
223
+ return enum_for(__method__) unless block_given?
224
+ yield self
225
+ end
226
+ end
227
+ end
228
+ end