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,120 +1,124 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # Helper methods for performing type checks
6
- #
7
- module Checks
8
- module_function
9
-
10
- # Compare an expected type with an inferred type. Common usage is to
11
- # check if the type declared in a method's @return tag matches the type
12
- # inferred from static analysis of the code.
13
- #
14
- # @param api_map [ApiMap]
15
- # @param expected [ComplexType]
16
- # @param inferred [ComplexType]
17
- # @return [Boolean]
18
- def types_match? api_map, expected, inferred
19
- return true if expected.to_s == inferred.to_s
20
- matches = []
21
- expected.each do |exp|
22
- found = false
23
- inferred.each do |inf|
24
- # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
25
- if either_way?(api_map, inf, exp)
26
- found = true
27
- matches.push inf
28
- break
29
- end
30
- end
31
- return false unless found
32
- end
33
- inferred.each do |inf|
34
- next if matches.include?(inf)
35
- found = false
36
- expected.each do |exp|
37
- # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
38
- if either_way?(api_map, inf, exp)
39
- found = true
40
- break
41
- end
42
- end
43
- return false unless found
44
- end
45
- true
46
- end
47
-
48
- # @param api_map [ApiMap]
49
- # @param expected [ComplexType]
50
- # @param inferred [ComplexType]
51
- # @return [Boolean]
52
- def any_types_match? api_map, expected, inferred
53
- return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
54
- # walk through the union expected type and see if any members
55
- # of the union match the inferred type
56
- expected.each do |exp|
57
- next if exp.duck_type?
58
- # @todo: there should be a level of typechecking where all
59
- # unique types in the inferred must match one of the
60
- # expected unique types
61
- inferred.each do |inf|
62
- # return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
63
- return true if exp == inf || either_way?(api_map, inf, exp)
64
- end
65
- end
66
- false
67
- end
68
-
69
- # @param api_map [ApiMap]
70
- # @param inferred [ComplexType]
71
- # @param expected [ComplexType]
72
- # @return [Boolean]
73
- def all_types_match? api_map, inferred, expected
74
- return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
75
- inferred.each do |inf|
76
- next if inf.duck_type?
77
- return false unless expected.any? { |exp| exp == inf || either_way?(api_map, inf, exp) }
78
- end
79
- true
80
- end
81
-
82
- # @param api_map [ApiMap]
83
- # @param expected [ComplexType]
84
- # @param inferred [ComplexType]
85
- # @return [Boolean]
86
- def duck_types_match? api_map, expected, inferred
87
- raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
88
- expected.each do |exp|
89
- next unless exp.duck_type?
90
- quack = exp.to_s[1..-1]
91
- return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
92
- end
93
- true
94
- end
95
-
96
- # @param type [ComplexType::UniqueType]
97
- # @return [String]
98
- def fuzz type
99
- if type.parameters?
100
- type.name
101
- else
102
- type.tag
103
- end
104
- end
105
-
106
- # @param api_map [ApiMap]
107
- # @param cls1 [ComplexType::UniqueType]
108
- # @param cls2 [ComplexType::UniqueType]
109
- # @return [Boolean]
110
- def either_way?(api_map, cls1, cls2)
111
- # @todo there should be a level of typechecking which uses the
112
- # full tag with parameters to determine compatibility
113
- f1 = cls1.name
114
- f2 = cls2.name
115
- api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
116
- # api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
117
- end
118
- end
119
- end
120
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # Helper methods for performing type checks
6
+ #
7
+ module Checks
8
+ module_function
9
+
10
+ # Compare an expected type with an inferred type. Common usage is to
11
+ # check if the type declared in a method's @return tag matches the type
12
+ # inferred from static analysis of the code.
13
+ #
14
+ # @param api_map [ApiMap]
15
+ # @param expected [ComplexType]
16
+ # @param inferred [ComplexType]
17
+ # @return [Boolean]
18
+ def types_match? api_map, expected, inferred
19
+ return true if expected.to_s == inferred.to_s
20
+ matches = []
21
+ expected.each do |exp|
22
+ found = false
23
+ inferred.each do |inf|
24
+ # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
25
+ if either_way?(api_map, inf, exp)
26
+ found = true
27
+ matches.push inf
28
+ break
29
+ end
30
+ end
31
+ return false unless found
32
+ end
33
+ inferred.each do |inf|
34
+ next if matches.include?(inf)
35
+ found = false
36
+ expected.each do |exp|
37
+ # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
38
+ if either_way?(api_map, inf, exp)
39
+ found = true
40
+ break
41
+ end
42
+ end
43
+ return false unless found
44
+ end
45
+ true
46
+ end
47
+
48
+ # @param api_map [ApiMap]
49
+ # @param expected [ComplexType]
50
+ # @param inferred [ComplexType]
51
+ # @return [Boolean]
52
+ def any_types_match? api_map, expected, inferred
53
+ expected = expected.downcast_to_literal_if_possible
54
+ inferred = inferred.downcast_to_literal_if_possible
55
+ return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
56
+ # walk through the union expected type and see if any members
57
+ # of the union match the inferred type
58
+ expected.each do |exp|
59
+ next if exp.duck_type?
60
+ # @todo: there should be a level of typechecking where all
61
+ # unique types in the inferred must match one of the
62
+ # expected unique types
63
+ inferred.each do |inf|
64
+ # return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
65
+ return true if exp == inf || either_way?(api_map, inf, exp)
66
+ end
67
+ end
68
+ false
69
+ end
70
+
71
+ # @param api_map [ApiMap]
72
+ # @param inferred [ComplexType]
73
+ # @param expected [ComplexType]
74
+ # @return [Boolean]
75
+ def all_types_match? api_map, inferred, expected
76
+ expected = expected.downcast_to_literal_if_possible
77
+ inferred = inferred.downcast_to_literal_if_possible
78
+ return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
79
+ inferred.each do |inf|
80
+ next if inf.duck_type?
81
+ return false unless expected.any? { |exp| exp == inf || either_way?(api_map, inf, exp) }
82
+ end
83
+ true
84
+ end
85
+
86
+ # @param api_map [ApiMap]
87
+ # @param expected [ComplexType]
88
+ # @param inferred [ComplexType]
89
+ # @return [Boolean]
90
+ def duck_types_match? api_map, expected, inferred
91
+ raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
92
+ expected.each do |exp|
93
+ next unless exp.duck_type?
94
+ quack = exp.to_s[1..-1]
95
+ return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
96
+ end
97
+ true
98
+ end
99
+
100
+ # @param type [ComplexType::UniqueType]
101
+ # @return [String]
102
+ def fuzz type
103
+ if type.parameters?
104
+ type.name
105
+ else
106
+ type.tag
107
+ end
108
+ end
109
+
110
+ # @param api_map [ApiMap]
111
+ # @param cls1 [ComplexType::UniqueType]
112
+ # @param cls2 [ComplexType::UniqueType]
113
+ # @return [Boolean]
114
+ def either_way?(api_map, cls1, cls2)
115
+ # @todo there should be a level of typechecking which uses the
116
+ # full tag with parameters to determine compatibility
117
+ f1 = cls1.name
118
+ f2 = cls2.name
119
+ api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
120
+ # api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
121
+ end
122
+ end
123
+ end
124
+ end
@@ -1,35 +1,37 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # Data about a method parameter definition. This is the information from
6
- # the args list in the def call, not the `@param` tags.
7
- #
8
- class ParamDef
9
- # @return [String]
10
- attr_reader :name
11
-
12
- # @return [Symbol]
13
- attr_reader :type
14
-
15
- def initialize name, type
16
- @name = name
17
- @type = type
18
- end
19
-
20
- class << self
21
- # Get an array of ParamDefs from a method pin.
22
- #
23
- # @param pin [Solargraph::Pin::Method]
24
- # @return [Array<ParamDef>]
25
- def from pin
26
- result = []
27
- pin.parameters.each do |par|
28
- result.push ParamDef.new(par.name, par.decl)
29
- end
30
- result
31
- end
32
- end
33
- end
34
- end
35
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # Data about a method parameter definition. This is the information from
6
+ # the args list in the def call, not the `@param` tags.
7
+ #
8
+ class ParamDef
9
+ # @return [String]
10
+ attr_reader :name
11
+
12
+ # @return [Symbol]
13
+ attr_reader :type
14
+
15
+ # @param name [String]
16
+ # @param type [Symbol] The type of parameter, such as :req, :opt, :rest, etc.
17
+ def initialize name, type
18
+ @name = name
19
+ @type = type
20
+ end
21
+
22
+ class << self
23
+ # Get an array of ParamDefs from a method pin.
24
+ #
25
+ # @param pin [Solargraph::Pin::Method]
26
+ # @return [Array<ParamDef>]
27
+ def from pin
28
+ result = []
29
+ pin.parameters.each do |par|
30
+ result.push ParamDef.new(par.name, par.decl)
31
+ end
32
+ result
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,32 +1,32 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # A problem reported by TypeChecker.
6
- #
7
- class Problem
8
- # @return [Solargraph::Location]
9
- attr_reader :location
10
-
11
- # @return [String]
12
- attr_reader :message
13
-
14
- # @return [Pin::Base]
15
- attr_reader :pin
16
-
17
- # @return [String, nil]
18
- attr_reader :suggestion
19
-
20
- # @param location [Solargraph::Location]
21
- # @param message [String]
22
- # @param pin [Solargraph::Pin::Base, nil]
23
- # @param suggestion [String, nil]
24
- def initialize location, message, pin: nil, suggestion: nil
25
- @location = location
26
- @message = message
27
- @pin = pin
28
- @suggestion = suggestion
29
- end
30
- end
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # A problem reported by TypeChecker.
6
+ #
7
+ class Problem
8
+ # @return [Solargraph::Location]
9
+ attr_reader :location
10
+
11
+ # @return [String]
12
+ attr_reader :message
13
+
14
+ # @return [Pin::Base]
15
+ attr_reader :pin
16
+
17
+ # @return [String, nil]
18
+ attr_reader :suggestion
19
+
20
+ # @param location [Solargraph::Location]
21
+ # @param message [String]
22
+ # @param pin [Solargraph::Pin::Base, nil]
23
+ # @param suggestion [String, nil]
24
+ def initialize location, message, pin: nil, suggestion: nil
25
+ @location = location
26
+ @message = message
27
+ @pin = pin
28
+ @suggestion = suggestion
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,62 +1,84 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # Definitions of type checking rules to be performed at various levels
6
- #
7
- class Rules
8
- LEVELS = {
9
- normal: 0,
10
- typed: 1,
11
- strict: 2,
12
- strong: 3,
13
- alpha: 4
14
- }.freeze
15
-
16
- # @return [Symbol]
17
- attr_reader :level
18
-
19
- # @return [Integer]
20
- attr_reader :rank
21
-
22
- # @param level [Symbol]
23
- def initialize level
24
- @rank = if LEVELS.key?(level)
25
- LEVELS[level]
26
- else
27
- Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
28
- 0
29
- end
30
- @level = LEVELS[LEVELS.values.index(@rank)]
31
- end
32
-
33
- def ignore_all_undefined?
34
- rank < LEVELS[:strict]
35
- end
36
-
37
- def validate_consts?
38
- rank >= LEVELS[:strict]
39
- end
40
-
41
- def validate_calls?
42
- rank >= LEVELS[:strict]
43
- end
44
-
45
- def require_type_tags?
46
- rank >= LEVELS[:strong]
47
- end
48
-
49
- def must_tag_or_infer?
50
- rank > LEVELS[:typed]
51
- end
52
-
53
- def validate_tags?
54
- rank > LEVELS[:normal]
55
- end
56
-
57
- def require_all_return_types_match_inferred?
58
- rank >= LEVELS[:alpha]
59
- end
60
- end
61
- end
62
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # Definitions of type checking rules to be performed at various levels
6
+ #
7
+ class Rules
8
+ LEVELS = {
9
+ normal: 0,
10
+ typed: 1,
11
+ strict: 2,
12
+ strong: 3,
13
+ alpha: 4
14
+ }.freeze
15
+
16
+ # @return [Symbol]
17
+ attr_reader :level
18
+
19
+ # @return [Integer]
20
+ attr_reader :rank
21
+
22
+ # @param level [Symbol]
23
+ # @param overrides [Hash{Symbol => Symbol}]
24
+ def initialize level, overrides
25
+ @rank = if LEVELS.key?(level)
26
+ LEVELS[level]
27
+ else
28
+ Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
29
+ 0
30
+ end
31
+ @level = LEVELS[LEVELS.values.index(@rank)]
32
+ @overrides = overrides
33
+ end
34
+
35
+ def ignore_all_undefined?
36
+ !report_undefined?
37
+ end
38
+
39
+ def report_undefined?
40
+ report?(:report_undefined, :strict)
41
+ end
42
+
43
+ def validate_consts?
44
+ report?(:validate_consts, :strict)
45
+ end
46
+
47
+ def validate_calls?
48
+ report?(:validate_calls, :strict)
49
+ end
50
+
51
+ def require_type_tags?
52
+ report?(:validate_type_tags, :strong)
53
+ end
54
+
55
+ def must_tag_or_infer?
56
+ report?(:must_tag_or_infer, :strict)
57
+ end
58
+
59
+ def validate_tags?
60
+ report?(:validate_tags, :typed)
61
+ end
62
+
63
+ def require_all_return_types_match_inferred?
64
+ report?(:require_all_return_types_match_inferred, :alpha)
65
+ end
66
+
67
+ # We keep this at strong because if you added an @ sg-ignore to
68
+ # address a strong-level issue, then ran at a lower level, you'd
69
+ # get a false positive - we don't run stronger level checks than
70
+ # requested for performance reasons
71
+ def validate_sg_ignores?
72
+ report?(:validate_sg_ignores, :strong)
73
+ end
74
+
75
+ private
76
+
77
+ # @param type [Symbol]
78
+ # @param level [Symbol]
79
+ def report?(type, level)
80
+ rank >= LEVELS[@overrides.fetch(type, level)]
81
+ end
82
+ end
83
+ end
84
+ end