solargraph 0.46.0 → 0.47.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -41
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1130 -1115
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -128
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +17 -18
  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 -686
  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 +225 -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 -30
  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 -53
  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 +56 -54
  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 -135
  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 -144
  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 -63
  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 -63
  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 +73 -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 -201
  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 -56
  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 -37
  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 +239 -212
  220. data/lib/solargraph/source_map.rb +180 -180
  221. data/lib/solargraph/type_checker/checks.rb +112 -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 -543
  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 -215
  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 -208
  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 -460
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +12 -12
@@ -1,221 +1,225 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # A container for type data based on YARD type tags.
5
- #
6
- class ComplexType
7
- # @!parse
8
- # include TypeMethods
9
-
10
- autoload :TypeMethods, 'solargraph/complex_type/type_methods'
11
- autoload :UniqueType, 'solargraph/complex_type/unique_type'
12
-
13
- # @param types [Array<UniqueType>]
14
- def initialize types = [UniqueType::UNDEFINED]
15
- @items = types.uniq(&:to_s)
16
- end
17
-
18
- # @param api_map [ApiMap]
19
- # @param context [String]
20
- # @return [ComplexType]
21
- def qualify api_map, context = ''
22
- types = @items.map do |t|
23
- next t if ['Boolean', 'nil', 'void', 'undefined'].include?(t.name)
24
- t.qualify api_map, context
25
- end
26
- ComplexType.new(types)
27
- end
28
-
29
- def first
30
- @items.first
31
- end
32
-
33
- def map &block
34
- @items.map &block
35
- end
36
-
37
- # @yieldparam [UniqueType]
38
- # @return [Array]
39
- def each &block
40
- @items.each &block
41
- end
42
-
43
- def length
44
- @items.length
45
- end
46
-
47
- def [](index)
48
- @items[index]
49
- end
50
-
51
- def select &block
52
- @items.select &block
53
- end
54
- def namespace
55
- # cache this attr for high frequency call
56
- @namespace ||= method_missing(:namespace).to_s
57
- end
58
-
59
- def method_missing name, *args, &block
60
- return if @items.first.nil?
61
- return @items.first.send(name, *args, &block) if respond_to_missing?(name)
62
- super
63
- end
64
-
65
- def respond_to_missing?(name, include_private = false)
66
- TypeMethods.public_instance_methods.include?(name) || super
67
- end
68
-
69
- def to_s
70
- map(&:tag).join(', ')
71
- end
72
-
73
- def all? &block
74
- @items.all? &block
75
- end
76
-
77
- def selfy?
78
- @items.any?(&:selfy?)
79
- end
80
-
81
- # @param dst [String]
82
- # @return [ComplexType]
83
- def self_to dst
84
- return self unless selfy?
85
- red = reduce_class(dst)
86
- result = @items.map { |i| i.self_to red }
87
- ComplexType.parse(*result.map(&:tag))
88
- end
89
-
90
- def nullable?
91
- @items.any?(&:nil_type?)
92
- end
93
-
94
- private
95
-
96
- # @todo This is a quick and dirty hack that forces `self` keywords
97
- # to reference an instance of their class and never the class itself.
98
- # This behavior may change depending on which result is expected
99
- # from YARD conventions. See https://github.com/lsegal/yard/issues/1257
100
- # @param dst [String]
101
- # @return [String]
102
- def reduce_class dst
103
- while dst =~ /^(Class|Module)\<(.*?)\>$/
104
- dst = dst.sub(/^(Class|Module)\</, '').sub(/\>$/, '')
105
- end
106
- dst
107
- end
108
-
109
- class << self
110
- # Parse type strings into a ComplexType.
111
- #
112
- # @example
113
- # ComplexType.parse 'String', 'Foo', 'nil' #=> [String, Foo, nil]
114
- #
115
- # @note
116
- # The `partial` parameter is used to indicate that the method is
117
- # receiving a string that will be used inside another ComplexType.
118
- # It returns arrays of ComplexTypes instead of a single cohesive one.
119
- # Consumers should not need to use this parameter; it should only be
120
- # used internally.
121
- #
122
- # @param *strings [Array<String>] The type definitions to parse
123
- # @param partial [Boolean] True if the string is part of a another type
124
- # @return [ComplexType, Array, nil]
125
- def parse *strings, partial: false
126
- @cache ||= {}
127
- unless partial
128
- cached = @cache[strings]
129
- return cached unless cached.nil?
130
- end
131
- types = []
132
- key_types = nil
133
- strings.each do |type_string|
134
- point_stack = 0
135
- curly_stack = 0
136
- paren_stack = 0
137
- base = String.new
138
- subtype_string = String.new
139
- type_string.each_char do |char|
140
- if char == '='
141
- #raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
142
- elsif char == '<'
143
- point_stack += 1
144
- elsif char == '>'
145
- if subtype_string.end_with?('=') && curly_stack > 0
146
- subtype_string += char
147
- elsif base.end_with?('=')
148
- raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
149
- # types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
150
- types.push UniqueType.new(base[0..-2].strip)
151
- key_types = types
152
- types = []
153
- base.clear
154
- subtype_string.clear
155
- next
156
- else
157
- point_stack -= 1
158
- subtype_string += char if point_stack == 0
159
- raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack < 0
160
- end
161
- next
162
- elsif char == '{'
163
- curly_stack += 1
164
- elsif char == '}'
165
- curly_stack -= 1
166
- subtype_string += char
167
- raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
168
- next
169
- elsif char == '('
170
- paren_stack += 1
171
- elsif char == ')'
172
- paren_stack -= 1
173
- subtype_string += char if paren_stack == 0
174
- raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
175
- next
176
- elsif char == ',' && point_stack == 0 && curly_stack == 0 && paren_stack == 0
177
- # types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
178
- types.push UniqueType.new(base.strip, subtype_string.strip)
179
- base.clear
180
- subtype_string.clear
181
- next
182
- end
183
- if point_stack == 0 && curly_stack == 0 && paren_stack == 0
184
- base.concat char
185
- else
186
- subtype_string.concat char
187
- end
188
- end
189
- raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 || curly_stack != 0 || paren_stack != 0
190
- # types.push ComplexType.new([UniqueType.new(base, subtype_string)])
191
- types.push UniqueType.new(base.strip, subtype_string.strip)
192
- end
193
- unless key_types.nil?
194
- raise ComplexTypeError, "Invalid use of key/value parameters" unless partial
195
- return key_types if types.empty?
196
- return [key_types, types]
197
- end
198
- result = partial ? types : ComplexType.new(types)
199
- @cache[strings] = result unless partial
200
- result
201
- end
202
-
203
- # @param strings [Array<String>]
204
- # @return [ComplexType]
205
- def try_parse *strings
206
- parse *strings
207
- rescue ComplexTypeError => e
208
- Solargraph.logger.info "Error parsing complex type: #{e.message}"
209
- ComplexType::UNDEFINED
210
- end
211
- end
212
-
213
- VOID = ComplexType.parse('void')
214
- UNDEFINED = ComplexType.parse('undefined')
215
- SYMBOL = ComplexType.parse('Symbol')
216
- ROOT = ComplexType.parse('Class<>')
217
- NIL = ComplexType.parse('nil')
218
- SELF = ComplexType.parse('self')
219
- BOOLEAN = ComplexType.parse('Boolean')
220
- end
221
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A container for type data based on YARD type tags.
5
+ #
6
+ class ComplexType
7
+ # @!parse
8
+ # include TypeMethods
9
+
10
+ autoload :TypeMethods, 'solargraph/complex_type/type_methods'
11
+ autoload :UniqueType, 'solargraph/complex_type/unique_type'
12
+
13
+ # @param types [Array<UniqueType>]
14
+ def initialize types = [UniqueType::UNDEFINED]
15
+ @items = types.uniq(&:to_s)
16
+ end
17
+
18
+ # @param api_map [ApiMap]
19
+ # @param context [String]
20
+ # @return [ComplexType]
21
+ def qualify api_map, context = ''
22
+ types = @items.map do |t|
23
+ next t if ['Boolean', 'nil', 'void', 'undefined'].include?(t.name)
24
+ t.qualify api_map, context
25
+ end
26
+ ComplexType.new(types)
27
+ end
28
+
29
+ def first
30
+ @items.first
31
+ end
32
+
33
+ def map &block
34
+ @items.map &block
35
+ end
36
+
37
+ # @yieldparam [UniqueType]
38
+ # @return [Array]
39
+ def each &block
40
+ @items.each &block
41
+ end
42
+
43
+ def length
44
+ @items.length
45
+ end
46
+
47
+ def [](index)
48
+ @items[index]
49
+ end
50
+
51
+ def select &block
52
+ @items.select &block
53
+ end
54
+ def namespace
55
+ # cache this attr for high frequency call
56
+ @namespace ||= method_missing(:namespace).to_s
57
+ end
58
+
59
+ def method_missing name, *args, &block
60
+ return if @items.first.nil?
61
+ return @items.first.send(name, *args, &block) if respond_to_missing?(name)
62
+ super
63
+ end
64
+
65
+ def respond_to_missing?(name, include_private = false)
66
+ TypeMethods.public_instance_methods.include?(name) || super
67
+ end
68
+
69
+ def to_s
70
+ map(&:tag).join(', ')
71
+ end
72
+
73
+ def all? &block
74
+ @items.all? &block
75
+ end
76
+
77
+ def any? &block
78
+ @items.any? &block
79
+ end
80
+
81
+ def selfy?
82
+ @items.any?(&:selfy?)
83
+ end
84
+
85
+ # @param dst [String]
86
+ # @return [ComplexType]
87
+ def self_to dst
88
+ return self unless selfy?
89
+ red = reduce_class(dst)
90
+ result = @items.map { |i| i.self_to red }
91
+ ComplexType.parse(*result.map(&:tag))
92
+ end
93
+
94
+ def nullable?
95
+ @items.any?(&:nil_type?)
96
+ end
97
+
98
+ private
99
+
100
+ # @todo This is a quick and dirty hack that forces `self` keywords
101
+ # to reference an instance of their class and never the class itself.
102
+ # This behavior may change depending on which result is expected
103
+ # from YARD conventions. See https://github.com/lsegal/yard/issues/1257
104
+ # @param dst [String]
105
+ # @return [String]
106
+ def reduce_class dst
107
+ while dst =~ /^(Class|Module)\<(.*?)\>$/
108
+ dst = dst.sub(/^(Class|Module)\</, '').sub(/\>$/, '')
109
+ end
110
+ dst
111
+ end
112
+
113
+ class << self
114
+ # Parse type strings into a ComplexType.
115
+ #
116
+ # @example
117
+ # ComplexType.parse 'String', 'Foo', 'nil' #=> [String, Foo, nil]
118
+ #
119
+ # @note
120
+ # The `partial` parameter is used to indicate that the method is
121
+ # receiving a string that will be used inside another ComplexType.
122
+ # It returns arrays of ComplexTypes instead of a single cohesive one.
123
+ # Consumers should not need to use this parameter; it should only be
124
+ # used internally.
125
+ #
126
+ # @param *strings [Array<String>] The type definitions to parse
127
+ # @param partial [Boolean] True if the string is part of a another type
128
+ # @return [ComplexType, Array, nil]
129
+ def parse *strings, partial: false
130
+ @cache ||= {}
131
+ unless partial
132
+ cached = @cache[strings]
133
+ return cached unless cached.nil?
134
+ end
135
+ types = []
136
+ key_types = nil
137
+ strings.each do |type_string|
138
+ point_stack = 0
139
+ curly_stack = 0
140
+ paren_stack = 0
141
+ base = String.new
142
+ subtype_string = String.new
143
+ type_string.each_char do |char|
144
+ if char == '='
145
+ #raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
146
+ elsif char == '<'
147
+ point_stack += 1
148
+ elsif char == '>'
149
+ if subtype_string.end_with?('=') && curly_stack > 0
150
+ subtype_string += char
151
+ elsif base.end_with?('=')
152
+ raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
153
+ # types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
154
+ types.push UniqueType.new(base[0..-2].strip)
155
+ key_types = types
156
+ types = []
157
+ base.clear
158
+ subtype_string.clear
159
+ next
160
+ else
161
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack == 0
162
+ point_stack -= 1
163
+ subtype_string += char
164
+ end
165
+ next
166
+ elsif char == '{'
167
+ curly_stack += 1
168
+ elsif char == '}'
169
+ curly_stack -= 1
170
+ subtype_string += char
171
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
172
+ next
173
+ elsif char == '('
174
+ paren_stack += 1
175
+ elsif char == ')'
176
+ paren_stack -= 1
177
+ subtype_string += char if paren_stack == 0
178
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
179
+ next
180
+ elsif char == ',' && point_stack == 0 && curly_stack == 0 && paren_stack == 0
181
+ # types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
182
+ types.push UniqueType.new(base.strip, subtype_string.strip)
183
+ base.clear
184
+ subtype_string.clear
185
+ next
186
+ end
187
+ if point_stack == 0 && curly_stack == 0 && paren_stack == 0
188
+ base.concat char
189
+ else
190
+ subtype_string.concat char
191
+ end
192
+ end
193
+ raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 || curly_stack != 0 || paren_stack != 0
194
+ # types.push ComplexType.new([UniqueType.new(base, subtype_string)])
195
+ types.push UniqueType.new(base.strip, subtype_string.strip)
196
+ end
197
+ unless key_types.nil?
198
+ raise ComplexTypeError, "Invalid use of key/value parameters" unless partial
199
+ return key_types if types.empty?
200
+ return [key_types, types]
201
+ end
202
+ result = partial ? types : ComplexType.new(types)
203
+ @cache[strings] = result unless partial
204
+ result
205
+ end
206
+
207
+ # @param strings [Array<String>]
208
+ # @return [ComplexType]
209
+ def try_parse *strings
210
+ parse *strings
211
+ rescue ComplexTypeError => e
212
+ Solargraph.logger.info "Error parsing complex type: #{e.message}"
213
+ ComplexType::UNDEFINED
214
+ end
215
+ end
216
+
217
+ VOID = ComplexType.parse('void')
218
+ UNDEFINED = ComplexType.parse('undefined')
219
+ SYMBOL = ComplexType.parse('Symbol')
220
+ ROOT = ComplexType.parse('Class<>')
221
+ NIL = ComplexType.parse('nil')
222
+ SELF = ComplexType.parse('self')
223
+ BOOLEAN = ComplexType.parse('Boolean')
224
+ end
225
+ end
@@ -1,33 +1,33 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- # The base class for Conventions.
6
- #
7
- # A Convention provides Environs that customize ApiMaps with additional
8
- # pins and other information. Subclasses should implement the `local` and
9
- # `global` methods as necessary.
10
- #
11
- class Base
12
- EMPTY_ENVIRON = Environ.new
13
-
14
- # The Environ for a source map.
15
- # Subclasses can override this method.
16
- #
17
- # @param source_map [SourceMap]
18
- # @return [Environ]
19
- def local source_map
20
- EMPTY_ENVIRON
21
- end
22
-
23
- # The Environ for a YARD map.
24
- # Subclasses can override this method.
25
- #
26
- # @param yard_map [YardMap]
27
- # @return [Environ]
28
- def global yard_map
29
- EMPTY_ENVIRON
30
- end
31
- end
32
- end
33
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ # The base class for Conventions.
6
+ #
7
+ # A Convention provides Environs that customize ApiMaps with additional
8
+ # pins and other information. Subclasses should implement the `local` and
9
+ # `global` methods as necessary.
10
+ #
11
+ class Base
12
+ EMPTY_ENVIRON = Environ.new
13
+
14
+ # The Environ for a source map.
15
+ # Subclasses can override this method.
16
+ #
17
+ # @param source_map [SourceMap]
18
+ # @return [Environ]
19
+ def local source_map
20
+ EMPTY_ENVIRON
21
+ end
22
+
23
+ # The Environ for a YARD map.
24
+ # Subclasses can override this method.
25
+ #
26
+ # @param yard_map [YardMap]
27
+ # @return [Environ]
28
+ def global yard_map
29
+ EMPTY_ENVIRON
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,15 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Gemfile < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
8
- @environ ||= Environ.new(
9
- requires: ['bundler'],
10
- domains: ['Bundler::Dsl']
11
- )
12
- end
13
- end
14
- end
15
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemfile < Base
6
+ def local source_map
7
+ return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
8
+ @environ ||= Environ.new(
9
+ requires: ['bundler'],
10
+ domains: ['Bundler::Dsl']
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,22 +1,22 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Gemspec < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
8
- @environ ||= Environ.new(
9
- requires: ['rubygems'],
10
- pins: [
11
- Solargraph::Pin::Reference::Override.from_comment(
12
- 'Gem::Specification.new',
13
- %(
14
- @yieldparam [self]
15
- )
16
- )
17
- ]
18
- )
19
- end
20
- end
21
- end
22
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemspec < Base
6
+ def local source_map
7
+ return EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
8
+ @environ ||= Environ.new(
9
+ requires: ['rubygems'],
10
+ pins: [
11
+ Solargraph::Pin::Reference::Override.from_comment(
12
+ 'Gem::Specification.new',
13
+ %(
14
+ @yieldparam [self]
15
+ )
16
+ )
17
+ ]
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,30 +1,30 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Rspec < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename) =~ /_spec\.rb$/
8
- @environ ||= Environ.new(
9
- requires: ['rspec'],
10
- domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
11
- pins: [
12
- # This override is necessary due to an erroneous @return tag in
13
- # rspec's YARD documentation.
14
- # @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
15
- Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
16
- ].concat(extras)
17
- )
18
- end
19
-
20
- private
21
-
22
- def extras
23
- @@extras ||= SourceMap.load_string(%(
24
- def describe(*args); end
25
- def it(*args); end
26
- )).pins
27
- end
28
- end
29
- end
30
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Rspec < Base
6
+ def local source_map
7
+ return EMPTY_ENVIRON unless File.basename(source_map.filename) =~ /_spec\.rb$/
8
+ @environ ||= Environ.new(
9
+ requires: ['rspec'],
10
+ domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
11
+ pins: [
12
+ # This override is necessary due to an erroneous @return tag in
13
+ # rspec's YARD documentation.
14
+ # @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
15
+ Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
16
+ ].concat(extras)
17
+ )
18
+ end
19
+
20
+ private
21
+
22
+ def extras
23
+ @@extras ||= SourceMap.load_string(%(
24
+ def describe(*args); end
25
+ def it(*args); end
26
+ )).pins
27
+ end
28
+ end
29
+ end
30
+ end