jimeh-solargraph 0.40.4.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 (252) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +54 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +24 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1003 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +123 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/jimeh-solargraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +21 -0
  16. data/lib/solargraph.rb +67 -0
  17. data/lib/solargraph/api_map.rb +752 -0
  18. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  19. data/lib/solargraph/api_map/cache.rb +70 -0
  20. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  21. data/lib/solargraph/api_map/store.rb +256 -0
  22. data/lib/solargraph/bench.rb +30 -0
  23. data/lib/solargraph/compat.rb +23 -0
  24. data/lib/solargraph/complex_type.rb +213 -0
  25. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  26. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  27. data/lib/solargraph/convention.rb +47 -0
  28. data/lib/solargraph/convention/base.rb +33 -0
  29. data/lib/solargraph/convention/gemfile.rb +15 -0
  30. data/lib/solargraph/convention/gemspec.rb +22 -0
  31. data/lib/solargraph/convention/rspec.rb +21 -0
  32. data/lib/solargraph/converters/dd.rb +12 -0
  33. data/lib/solargraph/converters/dl.rb +12 -0
  34. data/lib/solargraph/converters/dt.rb +12 -0
  35. data/lib/solargraph/converters/misc.rb +1 -0
  36. data/lib/solargraph/diagnostics.rb +55 -0
  37. data/lib/solargraph/diagnostics/base.rb +29 -0
  38. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
  41. data/lib/solargraph/diagnostics/severities.rb +15 -0
  42. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  43. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  44. data/lib/solargraph/documentor.rb +78 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server.rb +19 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  48. data/lib/solargraph/language_server/error_codes.rb +20 -0
  49. data/lib/solargraph/language_server/host.rb +746 -0
  50. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  51. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  52. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  53. data/lib/solargraph/language_server/host/sources.rb +156 -0
  54. data/lib/solargraph/language_server/message.rb +92 -0
  55. data/lib/solargraph/language_server/message/base.rb +85 -0
  56. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  61. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  62. data/lib/solargraph/language_server/message/extended.rb +21 -0
  63. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  64. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  65. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  66. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  67. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  68. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  69. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  70. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  71. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  72. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  73. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  74. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  75. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  76. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  77. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  78. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  79. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  81. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  82. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  83. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  84. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  85. data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
  86. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  87. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  88. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  89. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  90. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  91. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  97. data/lib/solargraph/language_server/message_types.rb +14 -0
  98. data/lib/solargraph/language_server/request.rb +24 -0
  99. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  100. data/lib/solargraph/language_server/transport.rb +13 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  104. data/lib/solargraph/library.rb +426 -0
  105. data/lib/solargraph/location.rb +37 -0
  106. data/lib/solargraph/logging.rb +27 -0
  107. data/lib/solargraph/page.rb +83 -0
  108. data/lib/solargraph/parser.rb +26 -0
  109. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  110. data/lib/solargraph/parser/legacy.rb +12 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
  115. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  116. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  117. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  118. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  119. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  120. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  121. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  123. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  124. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  125. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  126. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  127. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  128. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  129. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  130. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  131. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  132. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  133. data/lib/solargraph/parser/node_methods.rb +43 -0
  134. data/lib/solargraph/parser/node_processor.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +80 -0
  136. data/lib/solargraph/parser/region.rb +66 -0
  137. data/lib/solargraph/parser/rubyvm.rb +40 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  163. data/lib/solargraph/parser/snippet.rb +13 -0
  164. data/lib/solargraph/pin.rb +36 -0
  165. data/lib/solargraph/pin/base.rb +296 -0
  166. data/lib/solargraph/pin/base_variable.rb +84 -0
  167. data/lib/solargraph/pin/block.rb +62 -0
  168. data/lib/solargraph/pin/class_variable.rb +8 -0
  169. data/lib/solargraph/pin/closure.rb +37 -0
  170. data/lib/solargraph/pin/common.rb +70 -0
  171. data/lib/solargraph/pin/constant.rb +43 -0
  172. data/lib/solargraph/pin/conversions.rb +96 -0
  173. data/lib/solargraph/pin/documenting.rb +105 -0
  174. data/lib/solargraph/pin/duck_method.rb +16 -0
  175. data/lib/solargraph/pin/global_variable.rb +8 -0
  176. data/lib/solargraph/pin/instance_variable.rb +30 -0
  177. data/lib/solargraph/pin/keyword.rb +15 -0
  178. data/lib/solargraph/pin/keyword_param.rb +8 -0
  179. data/lib/solargraph/pin/local_variable.rb +21 -0
  180. data/lib/solargraph/pin/localized.rb +43 -0
  181. data/lib/solargraph/pin/method.rb +245 -0
  182. data/lib/solargraph/pin/method_alias.rb +31 -0
  183. data/lib/solargraph/pin/namespace.rb +85 -0
  184. data/lib/solargraph/pin/parameter.rb +206 -0
  185. data/lib/solargraph/pin/proxy_type.rb +29 -0
  186. data/lib/solargraph/pin/reference.rb +14 -0
  187. data/lib/solargraph/pin/reference/extend.rb +10 -0
  188. data/lib/solargraph/pin/reference/include.rb +10 -0
  189. data/lib/solargraph/pin/reference/override.rb +29 -0
  190. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  191. data/lib/solargraph/pin/reference/require.rb +14 -0
  192. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  193. data/lib/solargraph/pin/singleton.rb +11 -0
  194. data/lib/solargraph/pin/symbol.rb +47 -0
  195. data/lib/solargraph/position.rb +100 -0
  196. data/lib/solargraph/range.rb +95 -0
  197. data/lib/solargraph/server_methods.rb +16 -0
  198. data/lib/solargraph/shell.rb +222 -0
  199. data/lib/solargraph/source.rb +537 -0
  200. data/lib/solargraph/source/chain.rb +154 -0
  201. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  202. data/lib/solargraph/source/chain/call.rb +203 -0
  203. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  204. data/lib/solargraph/source/chain/constant.rb +75 -0
  205. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/head.rb +35 -0
  207. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/link.rb +67 -0
  209. data/lib/solargraph/source/chain/literal.rb +23 -0
  210. data/lib/solargraph/source/chain/or.rb +23 -0
  211. data/lib/solargraph/source/chain/variable.rb +13 -0
  212. data/lib/solargraph/source/chain/z_super.rb +30 -0
  213. data/lib/solargraph/source/change.rb +79 -0
  214. data/lib/solargraph/source/cursor.rb +164 -0
  215. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  216. data/lib/solargraph/source/source_chainer.rb +190 -0
  217. data/lib/solargraph/source/updater.rb +54 -0
  218. data/lib/solargraph/source_map.rb +188 -0
  219. data/lib/solargraph/source_map/clip.rb +224 -0
  220. data/lib/solargraph/source_map/completion.rb +23 -0
  221. data/lib/solargraph/source_map/mapper.rb +215 -0
  222. data/lib/solargraph/type_checker.rb +503 -0
  223. data/lib/solargraph/type_checker/checks.rb +99 -0
  224. data/lib/solargraph/type_checker/param_def.rb +35 -0
  225. data/lib/solargraph/type_checker/problem.rb +32 -0
  226. data/lib/solargraph/type_checker/rules.rb +57 -0
  227. data/lib/solargraph/version.rb +5 -0
  228. data/lib/solargraph/views/_method.erb +62 -0
  229. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  230. data/lib/solargraph/views/_namespace.erb +24 -0
  231. data/lib/solargraph/views/document.erb +23 -0
  232. data/lib/solargraph/views/environment.erb +58 -0
  233. data/lib/solargraph/views/layout.erb +44 -0
  234. data/lib/solargraph/views/search.erb +11 -0
  235. data/lib/solargraph/workspace.rb +209 -0
  236. data/lib/solargraph/workspace/config.rb +230 -0
  237. data/lib/solargraph/yard_map.rb +435 -0
  238. data/lib/solargraph/yard_map/cache.rb +19 -0
  239. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  240. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  241. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  242. data/lib/solargraph/yard_map/helpers.rb +16 -0
  243. data/lib/solargraph/yard_map/mapper.rb +77 -0
  244. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  245. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  246. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
  248. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  249. data/lib/solargraph/yard_map/to_method.rb +79 -0
  250. data/lib/yard-solargraph.rb +30 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +564 -0
@@ -0,0 +1,23 @@
1
+ unless Hash.method_defined?(:transform_values)
2
+ class Hash
3
+ def transform_values &block
4
+ each_pair do |k, v|
5
+ self[k] = block.call(v)
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ unless Array.method_defined?(:sum)
12
+ class Array
13
+ def sum &block
14
+ inject(0) do |s, x|
15
+ if block
16
+ s + block.call(x)
17
+ else
18
+ s + x
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,213 @@
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
+
55
+ def method_missing name, *args, &block
56
+ return if @items.first.nil?
57
+ return @items.first.send(name, *args, &block) if respond_to_missing?(name)
58
+ super
59
+ end
60
+
61
+ def respond_to_missing?(name, include_private = false)
62
+ TypeMethods.public_instance_methods.include?(name) || super
63
+ end
64
+
65
+ def to_s
66
+ map(&:tag).join(', ')
67
+ end
68
+
69
+ def all? &block
70
+ @items.all? &block
71
+ end
72
+
73
+ def selfy?
74
+ @items.any?(&:selfy?)
75
+ end
76
+
77
+ # @param dst [String]
78
+ # @return [ComplexType]
79
+ def self_to dst
80
+ return self unless selfy?
81
+ red = reduce_class(dst)
82
+ result = @items.map { |i| i.self_to red }
83
+ ComplexType.parse(*result.map(&:tag))
84
+ end
85
+
86
+ private
87
+
88
+ # @todo This is a quick and dirty hack that forces `self` keywords
89
+ # to reference an instance of their class and never the class itself.
90
+ # This behavior may change depending on which result is expected
91
+ # from YARD conventions. See https://github.com/lsegal/yard/issues/1257
92
+ # @param dst [String]
93
+ # @return [String]
94
+ def reduce_class dst
95
+ while dst =~ /^(Class|Module)\<(.*?)\>$/
96
+ dst = dst.sub(/^(Class|Module)\</, '').sub(/\>$/, '')
97
+ end
98
+ dst
99
+ end
100
+
101
+ class << self
102
+ # Parse type strings into a ComplexType.
103
+ #
104
+ # @example
105
+ # ComplexType.parse 'String', 'Foo', 'nil' #=> [String, Foo, nil]
106
+ #
107
+ # @note
108
+ # The `partial` parameter is used to indicate that the method is
109
+ # receiving a string that will be used inside another ComplexType.
110
+ # It returns arrays of ComplexTypes instead of a single cohesive one.
111
+ # Consumers should not need to use this parameter; it should only be
112
+ # used internally.
113
+ #
114
+ # @param *strings [Array<String>] The type definitions to parse
115
+ # @param partial [Boolean] True if the string is part of a another type
116
+ # @return [ComplexType, Array, nil]
117
+ def parse *strings, partial: false
118
+ @cache ||= {}
119
+ unless partial
120
+ cached = @cache[strings]
121
+ return cached unless cached.nil?
122
+ end
123
+ types = []
124
+ key_types = nil
125
+ strings.each do |type_string|
126
+ point_stack = 0
127
+ curly_stack = 0
128
+ paren_stack = 0
129
+ base = String.new
130
+ subtype_string = String.new
131
+ type_string.each_char do |char|
132
+ if char == '='
133
+ #raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
134
+ elsif char == '<'
135
+ point_stack += 1
136
+ elsif char == '>'
137
+ if subtype_string.end_with?('=') && curly_stack > 0
138
+ subtype_string += char
139
+ elsif base.end_with?('=')
140
+ raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
141
+ # types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
142
+ types.push UniqueType.new(base[0..-2].strip)
143
+ key_types = types
144
+ types = []
145
+ base.clear
146
+ subtype_string.clear
147
+ next
148
+ else
149
+ point_stack -= 1
150
+ subtype_string += char if point_stack == 0
151
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack < 0
152
+ end
153
+ next
154
+ elsif char == '{'
155
+ curly_stack += 1
156
+ elsif char == '}'
157
+ curly_stack -= 1
158
+ subtype_string += char
159
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
160
+ next
161
+ elsif char == '('
162
+ paren_stack += 1
163
+ elsif char == ')'
164
+ paren_stack -= 1
165
+ subtype_string += char if paren_stack == 0
166
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
167
+ next
168
+ elsif char == ',' && point_stack == 0 && curly_stack == 0 && paren_stack == 0
169
+ # types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
170
+ types.push UniqueType.new(base.strip, subtype_string.strip)
171
+ base.clear
172
+ subtype_string.clear
173
+ next
174
+ end
175
+ if point_stack == 0 && curly_stack == 0 && paren_stack == 0
176
+ base.concat char
177
+ else
178
+ subtype_string.concat char
179
+ end
180
+ end
181
+ raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 || curly_stack != 0 || paren_stack != 0
182
+ # types.push ComplexType.new([UniqueType.new(base, subtype_string)])
183
+ types.push UniqueType.new(base.strip, subtype_string.strip)
184
+ end
185
+ unless key_types.nil?
186
+ raise ComplexTypeError, "Invalid use of key/value parameters" unless partial
187
+ return key_types if types.empty?
188
+ return [key_types, types]
189
+ end
190
+ result = partial ? types : ComplexType.new(types)
191
+ @cache[strings] = result unless partial
192
+ result
193
+ end
194
+
195
+ # @param strings [Array<String>]
196
+ # @return [ComplexType]
197
+ def try_parse *strings
198
+ parse *strings
199
+ rescue ComplexTypeError => e
200
+ Solargraph.logger.info "Error parsing complex type: #{e.message}"
201
+ ComplexType::UNDEFINED
202
+ end
203
+ end
204
+
205
+ VOID = ComplexType.parse('void')
206
+ UNDEFINED = ComplexType.parse('undefined')
207
+ SYMBOL = ComplexType.parse('Symbol')
208
+ ROOT = ComplexType.parse('Class<>')
209
+ NIL = ComplexType.parse('nil')
210
+ SELF = ComplexType.parse('self')
211
+ BOOLEAN = ComplexType.parse('Boolean')
212
+ end
213
+ end
@@ -0,0 +1,127 @@
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
+ @namespace ||= 'Object' if duck_type?
76
+ @namespace ||= 'NilClass' if nil_type?
77
+ @namespace ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
78
+ end
79
+
80
+ # @return [Symbol] :class or :instance
81
+ def scope
82
+ @scope ||= :instance if duck_type? || nil_type?
83
+ @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
84
+ end
85
+
86
+ def == other
87
+ return false unless self.class == other.class
88
+ tag == other.tag
89
+ end
90
+
91
+ def rooted?
92
+ @rooted
93
+ end
94
+
95
+ # Generate a ComplexType that fully qualifies this type's namespaces.
96
+ #
97
+ # @param api_map [ApiMap] The ApiMap that performs qualification
98
+ # @param context [String] The namespace from which to resolve names
99
+ # @return [ComplexType] The generated ComplexType
100
+ def qualify api_map, context = ''
101
+ return ComplexType.new([self]) if duck_type? || void? || undefined?
102
+ recon = (rooted? ? '' : context)
103
+ fqns = api_map.qualify(name, recon)
104
+ if fqns.nil?
105
+ return UniqueType::BOOLEAN if tag == 'Boolean'
106
+ return UniqueType::UNDEFINED
107
+ end
108
+ fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
109
+ ltypes = key_types.map do |t|
110
+ t.qualify api_map, context
111
+ end
112
+ rtypes = value_types.map do |t|
113
+ t.qualify api_map, context
114
+ end
115
+ if list_parameters?
116
+ Solargraph::ComplexType.parse("#{fqns}<#{rtypes.map(&:tag).join(', ')}>")
117
+ elsif fixed_parameters?
118
+ Solargraph::ComplexType.parse("#{fqns}(#{rtypes.map(&:tag).join(', ')})")
119
+ elsif hash_parameters?
120
+ Solargraph::ComplexType.parse("#{fqns}{#{ltypes.map(&:tag).join(', ')} => #{rtypes.map(&:tag).join(', ')}}")
121
+ else
122
+ Solargraph::ComplexType.parse(fqns)
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +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
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Solargraph
6
+ # Conventions provide a way to modify an ApiMap based on expectations about
7
+ # one of its sources.
8
+ #
9
+ module Convention
10
+ autoload :Base, 'solargraph/convention/base'
11
+ autoload :Gemfile, 'solargraph/convention/gemfile'
12
+ autoload :Rspec, 'solargraph/convention/rspec'
13
+ autoload :Gemspec, 'solargraph/convention/gemspec'
14
+
15
+ @@conventions = Set.new
16
+
17
+ # @param convention [Class<Convention::Base>]
18
+ # @return [void]
19
+ def self.register convention
20
+ @@conventions.add convention.new
21
+ end
22
+
23
+ # @param source_map [SourceMap]
24
+ # @return [Environ]
25
+ def self.for_local(source_map)
26
+ result = Environ.new
27
+ @@conventions.each do |conv|
28
+ result.merge conv.local(source_map)
29
+ end
30
+ result
31
+ end
32
+
33
+ # @param yard_map [YardMap]
34
+ # @return [Environ]
35
+ def self.for_global(yard_map)
36
+ result = Environ.new
37
+ @@conventions.each do |conv|
38
+ result.merge conv.global(yard_map)
39
+ end
40
+ result
41
+ end
42
+
43
+ register Gemfile
44
+ register Gemspec
45
+ register Rspec
46
+ end
47
+ end