solargraph 0.56.0 → 0.58.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 (191) 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 +183 -7
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.gitignore +6 -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 +92 -1
  14. data/README.md +8 -4
  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 -175
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -266
  22. data/lib/solargraph/api_map.rb +945 -973
  23. data/lib/solargraph/bench.rb +1 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -222
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  26. data/lib/solargraph/complex_type.rb +444 -423
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +17 -0
  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/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -60
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -100
  35. data/lib/solargraph/convention/struct_definition.rb +164 -101
  36. data/lib/solargraph/convention.rb +32 -2
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -405
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -88
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -109
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -871
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  53. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  54. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  55. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  56. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  59. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  60. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  61. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  62. data/lib/solargraph/language_server/progress.rb +8 -0
  63. data/lib/solargraph/language_server/request.rb +4 -1
  64. data/lib/solargraph/library.rb +683 -666
  65. data/lib/solargraph/location.rb +82 -79
  66. data/lib/solargraph/logging.rb +37 -28
  67. data/lib/solargraph/page.rb +3 -0
  68. data/lib/solargraph/parser/comment_ripper.rb +69 -62
  69. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -227
  70. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  71. data/lib/solargraph/parser/node_processor.rb +62 -46
  72. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  73. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  74. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  75. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -497
  76. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  77. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  78. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  79. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -45
  80. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +1 -21
  81. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  82. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -21
  83. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  84. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  85. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  86. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +0 -22
  87. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -41
  88. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  89. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -37
  90. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  91. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -271
  92. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +1 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -66
  95. data/lib/solargraph/parser/region.rb +69 -66
  96. data/lib/solargraph/parser/snippet.rb +17 -15
  97. data/lib/solargraph/pin/base.rb +729 -651
  98. data/lib/solargraph/pin/base_variable.rb +126 -125
  99. data/lib/solargraph/pin/block.rb +104 -103
  100. data/lib/solargraph/pin/breakable.rb +9 -9
  101. data/lib/solargraph/pin/callable.rb +231 -218
  102. data/lib/solargraph/pin/closure.rb +72 -74
  103. data/lib/solargraph/pin/common.rb +79 -75
  104. data/lib/solargraph/pin/constant.rb +2 -0
  105. data/lib/solargraph/pin/conversions.rb +123 -123
  106. data/lib/solargraph/pin/delegated_method.rb +120 -120
  107. data/lib/solargraph/pin/documenting.rb +114 -114
  108. data/lib/solargraph/pin/instance_variable.rb +34 -34
  109. data/lib/solargraph/pin/keyword.rb +20 -20
  110. data/lib/solargraph/pin/local_variable.rb +75 -76
  111. data/lib/solargraph/pin/method.rb +672 -651
  112. data/lib/solargraph/pin/method_alias.rb +34 -31
  113. data/lib/solargraph/pin/namespace.rb +115 -115
  114. data/lib/solargraph/pin/parameter.rb +275 -261
  115. data/lib/solargraph/pin/proxy_type.rb +39 -35
  116. data/lib/solargraph/pin/reference/override.rb +47 -33
  117. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  118. data/lib/solargraph/pin/reference.rb +39 -22
  119. data/lib/solargraph/pin/search.rb +61 -56
  120. data/lib/solargraph/pin/signature.rb +61 -59
  121. data/lib/solargraph/pin/symbol.rb +53 -48
  122. data/lib/solargraph/pin/until.rb +18 -18
  123. data/lib/solargraph/pin/while.rb +18 -18
  124. data/lib/solargraph/pin.rb +44 -44
  125. data/lib/solargraph/pin_cache.rb +245 -185
  126. data/lib/solargraph/position.rb +132 -116
  127. data/lib/solargraph/range.rb +112 -107
  128. data/lib/solargraph/rbs_map/conversions.rb +823 -773
  129. data/lib/solargraph/rbs_map/core_fills.rb +18 -0
  130. data/lib/solargraph/rbs_map/core_map.rb +58 -51
  131. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  132. data/lib/solargraph/rbs_map.rb +163 -150
  133. data/lib/solargraph/shell.rb +352 -268
  134. data/lib/solargraph/source/chain/call.rb +337 -333
  135. data/lib/solargraph/source/chain/constant.rb +26 -89
  136. data/lib/solargraph/source/chain/hash.rb +34 -34
  137. data/lib/solargraph/source/chain/if.rb +28 -28
  138. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  139. data/lib/solargraph/source/chain/link.rb +11 -2
  140. data/lib/solargraph/source/chain/literal.rb +48 -48
  141. data/lib/solargraph/source/chain/or.rb +23 -23
  142. data/lib/solargraph/source/chain.rb +291 -282
  143. data/lib/solargraph/source/change.rb +82 -82
  144. data/lib/solargraph/source/cursor.rb +166 -167
  145. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  146. data/lib/solargraph/source/source_chainer.rb +194 -194
  147. data/lib/solargraph/source/updater.rb +55 -55
  148. data/lib/solargraph/source.rb +498 -495
  149. data/lib/solargraph/source_map/clip.rb +226 -234
  150. data/lib/solargraph/source_map/data.rb +34 -30
  151. data/lib/solargraph/source_map/mapper.rb +259 -259
  152. data/lib/solargraph/source_map.rb +212 -200
  153. data/lib/solargraph/type_checker/checks.rb +124 -124
  154. data/lib/solargraph/type_checker/param_def.rb +37 -35
  155. data/lib/solargraph/type_checker/problem.rb +32 -32
  156. data/lib/solargraph/type_checker/rules.rb +84 -62
  157. data/lib/solargraph/type_checker.rb +814 -699
  158. data/lib/solargraph/version.rb +5 -5
  159. data/lib/solargraph/workspace/config.rb +255 -239
  160. data/lib/solargraph/workspace/require_paths.rb +97 -0
  161. data/lib/solargraph/workspace.rb +220 -249
  162. data/lib/solargraph/yard_map/helpers.rb +44 -16
  163. data/lib/solargraph/yard_map/mapper/to_constant.rb +5 -5
  164. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -134
  165. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  166. data/lib/solargraph/yard_map/mapper.rb +79 -79
  167. data/lib/solargraph/yard_map/to_method.rb +89 -88
  168. data/lib/solargraph/yardoc.rb +87 -49
  169. data/lib/solargraph.rb +105 -90
  170. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  171. data/rbs/fills/open3/0/open3.rbs +172 -0
  172. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  173. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  174. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  175. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  176. data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +2 -3
  177. data/rbs/shims/ast/0/node.rbs +5 -0
  178. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  179. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  180. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  181. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  182. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  183. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  184. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  185. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  186. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  187. data/rbs_collection.yaml +4 -4
  188. data/solargraph.gemspec +26 -5
  189. metadata +187 -15
  190. data/lib/.rubocop.yml +0 -22
  191. data/lib/solargraph/parser/node_methods.rb +0 -97
@@ -13,16 +13,21 @@ module Solargraph
13
13
  # @return [Array<String>]
14
14
  attr_reader :domains
15
15
 
16
- # @return [Array<Pin::Reference::Override>]
16
+ # @return [Array<Pin::Base>]
17
17
  attr_reader :pins
18
18
 
19
+ # @return [Array<String>]
20
+ attr_reader :yard_plugins
21
+
19
22
  # @param requires [Array<String>]
20
23
  # @param domains [Array<String>]
21
24
  # @param pins [Array<Pin::Base>]
22
- def initialize requires: [], domains: [], pins: []
25
+ # @param yard_plugins [Array<String>]
26
+ def initialize requires: [], domains: [], pins: [], yard_plugins: []
23
27
  @requires = requires
24
28
  @domains = domains
25
29
  @pins = pins
30
+ @yard_plugins = yard_plugins
26
31
  end
27
32
 
28
33
  # @return [self]
@@ -30,6 +35,7 @@ module Solargraph
30
35
  domains.clear
31
36
  requires.clear
32
37
  pins.clear
38
+ yard_plugins.clear
33
39
  self
34
40
  end
35
41
 
@@ -39,6 +45,7 @@ module Solargraph
39
45
  domains.concat other.domains
40
46
  requires.concat other.requires
41
47
  pins.concat other.pins
48
+ yard_plugins.concat other.yard_plugins
42
49
  self
43
50
  end
44
51
  end
@@ -1,33 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # @abstract This mixin relies on these -
5
- # methods:
6
- # equality_fields()
7
- module Equality
8
- # @!method equality_fields
9
- # @return [Array]
10
-
11
- # @param other [Object]
12
- # @return [Boolean]
13
- def eql?(other)
14
- self.class.eql?(other.class) &&
15
- equality_fields.eql?(other.equality_fields)
16
- end
17
-
18
- # @param other [Object]
19
- # @return [Boolean]
20
- def ==(other)
21
- self.eql?(other)
22
- end
23
-
24
- def hash
25
- equality_fields.hash
26
- end
27
-
28
- def freeze
29
- equality_fields.each(&:freeze)
30
- super
31
- end
32
- end
33
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # @abstract This mixin relies on these -
5
+ # methods:
6
+ # equality_fields()
7
+ module Equality
8
+ # @!method equality_fields
9
+ # @return [Array]
10
+
11
+ # @param other [Object]
12
+ # @return [Boolean]
13
+ def eql?(other)
14
+ self.class.eql?(other.class) &&
15
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
16
+ equality_fields.eql?(other.equality_fields)
17
+ end
18
+
19
+ # @param other [Object]
20
+ # @return [Boolean]
21
+ def ==(other)
22
+ self.eql?(other)
23
+ end
24
+
25
+ def hash
26
+ equality_fields.hash
27
+ end
28
+
29
+ def freeze
30
+ equality_fields.each(&:freeze)
31
+ super
32
+ end
33
+ end
34
+ end
@@ -1,88 +1,98 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rbs'
4
-
5
- module Solargraph
6
- # A utility for building gem pins from a combination of YARD and RBS
7
- # documentation.
8
- #
9
- module GemPins
10
- class << self
11
- include Logging
12
- end
13
-
14
- # @param gemspec [Gem::Specification]
15
- # @return [Array<Pin::Base>]
16
- def self.build_yard_pins(gemspec)
17
- Yardoc.cache(gemspec) unless Yardoc.cached?(gemspec)
18
- yardoc = Yardoc.load!(gemspec)
19
- YardMap::Mapper.new(yardoc, gemspec).map
20
- end
21
-
22
- # @param pins [Array<Pin::Base>]
23
- def self.combine_method_pins_by_path(pins)
24
- # bad_pins = pins.select { |pin| pin.is_a?(Pin::Method) && pin.path == 'StringIO.open' && pin.source == :rbs }; raise "wtf: #{bad_pins}" if bad_pins.length > 1
25
- method_pins, alias_pins = pins.partition { |pin| pin.class == Pin::Method }
26
- by_path = method_pins.group_by(&:path)
27
- by_path.transform_values! do |pins|
28
- GemPins.combine_method_pins(*pins)
29
- end
30
- by_path.values + alias_pins
31
- end
32
-
33
- def self.combine_method_pins(*pins)
34
- out = pins.reduce(nil) do |memo, pin|
35
- next pin if memo.nil?
36
- if memo == pin && memo.source != :combined
37
- # @todo we should track down situations where we are handled
38
- # the same pin from the same source here and eliminate them -
39
- # this is an efficiency workaround for now
40
- next memo
41
- end
42
- memo.combine_with(pin)
43
- end
44
- logger.debug { "GemPins.combine_method_pins(pins.length=#{pins.length}, pins=#{pins}) => #{out.inspect}" }
45
- out
46
- end
47
-
48
- # @param yard_pins [Array<Pin::Base>]
49
- # @param rbs_map [RbsMap]
50
- # @return [Array<Pin::Base>]
51
- def self.combine(yard_pins, rbs_pins)
52
- in_yard = Set.new
53
- rbs_api_map = Solargraph::ApiMap.new(pins: rbs_pins)
54
- combined = yard_pins.map do |yard_pin|
55
- in_yard.add yard_pin.path
56
- rbs_pin = rbs_api_map.get_path_pins(yard_pin.path).filter { |pin| pin.is_a? Pin::Method }.first
57
- next yard_pin unless rbs_pin && yard_pin.class == Pin::Method
58
-
59
- unless rbs_pin
60
- logger.debug { "GemPins.combine: No rbs pin for #{yard_pin.path} - using YARD's '#{yard_pin.inspect} (return_type=#{yard_pin.return_type}; signatures=#{yard_pin.signatures})" }
61
- next yard_pin
62
- end
63
-
64
- out = combine_method_pins(rbs_pin, yard_pin)
65
- logger.debug { "GemPins.combine: Combining yard.path=#{yard_pin.path} - rbs=#{rbs_pin.inspect} with yard=#{yard_pin.inspect} into #{out}" }
66
- out
67
- end
68
- in_rbs_only = rbs_pins.select do |pin|
69
- pin.path.nil? || !in_yard.include?(pin.path)
70
- end
71
- out = combined + in_rbs_only
72
- logger.debug { "GemPins#combine: Returning #{out.length} combined pins" }
73
- out
74
- end
75
-
76
- class << self
77
- private
78
-
79
- # Select the first defined type.
80
- #
81
- # @param choices [Array<ComplexType>]
82
- # @return [ComplexType]
83
- def best_return_type *choices
84
- choices.find { |pin| pin.defined? } || choices.first || ComplexType::UNDEFINED
85
- end
86
- end
87
- end
88
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+
5
+ module Solargraph
6
+ # A utility for building gem pins from a combination of YARD and RBS
7
+ # documentation.
8
+ #
9
+ module GemPins
10
+ class << self
11
+ include Logging
12
+ end
13
+
14
+ # @param pins [Array<Pin::Base>]
15
+ # @return [Array<Pin::Base>]
16
+ def self.combine_method_pins_by_path(pins)
17
+ method_pins, alias_pins = pins.partition { |pin| pin.class == Pin::Method }
18
+ by_path = method_pins.group_by(&:path)
19
+ by_path.transform_values! do |pins|
20
+ GemPins.combine_method_pins(*pins)
21
+ end
22
+ by_path.values + alias_pins
23
+ end
24
+
25
+ # @param pins [Array<Pin::Method>]
26
+ # @return [Pin::Method, nil]
27
+ def self.combine_method_pins(*pins)
28
+ # @type [Pin::Method, nil]
29
+ combined_pin = nil
30
+ # @param memo [Pin::Method, nil]
31
+ # @param pin [Pin::Method]
32
+ out = pins.reduce(combined_pin) do |memo, pin|
33
+ next pin if memo.nil?
34
+ if memo == pin && memo.source != :combined
35
+ # @todo we should track down situations where we are handled
36
+ # the same pin from the same source here and eliminate them -
37
+ # this is an efficiency workaround for now
38
+ next memo
39
+ end
40
+ memo.combine_with(pin)
41
+ end
42
+ logger.debug { "GemPins.combine_method_pins(pins.length=#{pins.length}, pins=#{pins}) => #{out.inspect}" }
43
+ out
44
+ end
45
+
46
+ # @param yard_plugins [Array<String>] The names of YARD plugins to use.
47
+ # @param gemspec [Gem::Specification]
48
+ # @return [Array<Pin::Base>]
49
+ def self.build_yard_pins(yard_plugins, gemspec)
50
+ Yardoc.cache(yard_plugins, gemspec) unless Yardoc.cached?(gemspec)
51
+ return [] unless Yardoc.cached?(gemspec)
52
+ yardoc = Yardoc.load!(gemspec)
53
+ YardMap::Mapper.new(yardoc, gemspec).map
54
+ end
55
+
56
+ # @param yard_pins [Array<Pin::Base>]
57
+ # @param rbs_pins [Array<Pin::Base>]
58
+ #
59
+ # @return [Array<Pin::Base>]
60
+ def self.combine(yard_pins, rbs_pins)
61
+ in_yard = Set.new
62
+ rbs_api_map = Solargraph::ApiMap.new(pins: rbs_pins)
63
+ combined = yard_pins.map do |yard_pin|
64
+ in_yard.add yard_pin.path
65
+ rbs_pin = rbs_api_map.get_path_pins(yard_pin.path).filter { |pin| pin.is_a? Pin::Method }.first
66
+ next yard_pin unless rbs_pin && yard_pin.class == Pin::Method
67
+
68
+ unless rbs_pin
69
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
70
+ logger.debug { "GemPins.combine: No rbs pin for #{yard_pin.path} - using YARD's '#{yard_pin.inspect} (return_type=#{yard_pin.return_type}; signatures=#{yard_pin.signatures})" }
71
+ next yard_pin
72
+ end
73
+
74
+ out = combine_method_pins(rbs_pin, yard_pin)
75
+ logger.debug { "GemPins.combine: Combining yard.path=#{yard_pin.path} - rbs=#{rbs_pin.inspect} with yard=#{yard_pin.inspect} into #{out}" }
76
+ out
77
+ end
78
+ in_rbs_only = rbs_pins.select do |pin|
79
+ pin.path.nil? || !in_yard.include?(pin.path)
80
+ end
81
+ out = combined + in_rbs_only
82
+ logger.debug { "GemPins#combine: Returning #{out.length} combined pins" }
83
+ out
84
+ end
85
+
86
+ class << self
87
+ private
88
+
89
+ # Select the first defined type.
90
+ #
91
+ # @param choices [Array<ComplexType>]
92
+ # @return [ComplexType]
93
+ def best_return_type *choices
94
+ choices.find { |pin| pin.defined? } || choices.first || ComplexType::UNDEFINED
95
+ end
96
+ end
97
+ end
98
+ end
@@ -1,89 +1,89 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- class Host
6
- # An asynchronous diagnosis reporter.
7
- #
8
- class Diagnoser
9
- # @param host [Host]
10
- def initialize host
11
- @host = host
12
- @mutex = Mutex.new
13
- @queue = []
14
- @stopped = true
15
- end
16
-
17
- # Schedule a file to be diagnosed.
18
- #
19
- # @param uri [String]
20
- # @return [void]
21
- def schedule uri
22
- mutex.synchronize { queue.push uri }
23
- end
24
-
25
- # Stop the diagnosis thread.
26
- #
27
- # @return [void]
28
- def stop
29
- @stopped = true
30
- end
31
-
32
- # True is the diagnoser is stopped.
33
- #
34
- # @return [Boolean]
35
- def stopped?
36
- @stopped
37
- end
38
-
39
- # Start the diagnosis thread.
40
- #
41
- # @return [self, nil]
42
- def start
43
- return unless @stopped
44
- @stopped = false
45
- Thread.new do
46
- until stopped?
47
- tick
48
- sleep 0.1
49
- end
50
- end
51
- self
52
- end
53
-
54
- # Perform diagnoses.
55
- #
56
- # @return [void]
57
- def tick
58
- return if queue.empty? || host.synchronizing?
59
- if !host.options['diagnostics']
60
- mutex.synchronize { queue.clear }
61
- return
62
- end
63
- current = mutex.synchronize { queue.shift }
64
- return if queue.include?(current)
65
- begin
66
- host.diagnose current
67
- rescue InvalidOffsetError
68
- # @todo This error can occur when the Source is out of sync with
69
- # with the ApiMap. It's probably not the best way to handle it,
70
- # but it's quick and easy.
71
- Logging.logger.warn "Deferring diagnosis due to invalid offset: #{current}"
72
- mutex.synchronize { queue.push current }
73
- end
74
- end
75
-
76
- private
77
-
78
- # @return [Host]
79
- attr_reader :host
80
-
81
- # @return [Mutex]
82
- attr_reader :mutex
83
-
84
- # @return [::Array]
85
- attr_reader :queue
86
- end
87
- end
88
- end
89
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ class Host
6
+ # An asynchronous diagnosis reporter.
7
+ #
8
+ class Diagnoser
9
+ # @param host [Host]
10
+ def initialize host
11
+ @host = host
12
+ @mutex = Mutex.new
13
+ @queue = []
14
+ @stopped = true
15
+ end
16
+
17
+ # Schedule a file to be diagnosed.
18
+ #
19
+ # @param uri [String]
20
+ # @return [void]
21
+ def schedule uri
22
+ mutex.synchronize { queue.push uri }
23
+ end
24
+
25
+ # Stop the diagnosis thread.
26
+ #
27
+ # @return [void]
28
+ def stop
29
+ @stopped = true
30
+ end
31
+
32
+ # True is the diagnoser is stopped.
33
+ #
34
+ # @return [Boolean]
35
+ def stopped?
36
+ @stopped
37
+ end
38
+
39
+ # Start the diagnosis thread.
40
+ #
41
+ # @return [self, nil]
42
+ def start
43
+ return unless @stopped
44
+ @stopped = false
45
+ Thread.new do
46
+ until stopped?
47
+ tick
48
+ sleep 0.1
49
+ end
50
+ end
51
+ self
52
+ end
53
+
54
+ # Perform diagnoses.
55
+ #
56
+ # @return [void]
57
+ def tick
58
+ return if queue.empty? || host.synchronizing?
59
+ if !host.options['diagnostics']
60
+ mutex.synchronize { queue.clear }
61
+ return
62
+ end
63
+ current = mutex.synchronize { queue.shift }
64
+ return if queue.include?(current)
65
+ begin
66
+ host.diagnose current
67
+ rescue InvalidOffsetError
68
+ # @todo This error can occur when the Source is out of sync with
69
+ # with the ApiMap. It's probably not the best way to handle it,
70
+ # but it's quick and easy.
71
+ Logging.logger.warn "Deferring diagnosis due to invalid offset: #{current}"
72
+ mutex.synchronize { queue.push current }
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ # @return [Host]
79
+ attr_reader :host
80
+
81
+ # @return [Mutex]
82
+ attr_reader :mutex
83
+
84
+ # @return [::Array]
85
+ attr_reader :queue
86
+ end
87
+ end
88
+ end
89
+ end