solargraph 0.58.1 → 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +279 -279
- data/lib/solargraph/api_map/index.rb +193 -193
- data/lib/solargraph/api_map/source_to_yard.rb +97 -97
- data/lib/solargraph/api_map/store.rb +384 -384
- data/lib/solargraph/api_map.rb +945 -945
- data/lib/solargraph/complex_type/type_methods.rb +228 -228
- data/lib/solargraph/complex_type/unique_type.rb +482 -482
- data/lib/solargraph/complex_type.rb +444 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
- data/lib/solargraph/convention/data_definition.rb +105 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
- data/lib/solargraph/convention/struct_definition.rb +164 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +112 -112
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
- data/lib/solargraph/language_server/message/extended/document.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/library.rb +683 -683
- data/lib/solargraph/location.rb +82 -82
- data/lib/solargraph/logging.rb +37 -37
- data/lib/solargraph/parser/comment_ripper.rb +69 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
- data/lib/solargraph/parser/node_processor/base.rb +92 -92
- data/lib/solargraph/parser/node_processor.rb +62 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
- data/lib/solargraph/parser/region.rb +69 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +729 -729
- data/lib/solargraph/pin/base_variable.rb +126 -126
- data/lib/solargraph/pin/block.rb +104 -104
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -231
- data/lib/solargraph/pin/closure.rb +72 -72
- data/lib/solargraph/pin/common.rb +79 -79
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -120
- data/lib/solargraph/pin/documenting.rb +114 -114
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -20
- data/lib/solargraph/pin/local_variable.rb +75 -75
- data/lib/solargraph/pin/method.rb +672 -672
- data/lib/solargraph/pin/method_alias.rb +34 -34
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -275
- data/lib/solargraph/pin/proxy_type.rb +39 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +15 -15
- data/lib/solargraph/pin/reference.rb +39 -39
- data/lib/solargraph/pin/search.rb +61 -61
- data/lib/solargraph/pin/signature.rb +61 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +44 -44
- data/lib/solargraph/pin_cache.rb +245 -245
- data/lib/solargraph/position.rb +132 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +823 -823
- data/lib/solargraph/rbs_map/core_map.rb +58 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -163
- data/lib/solargraph/shell.rb +352 -352
- data/lib/solargraph/source/chain/call.rb +337 -337
- data/lib/solargraph/source/chain/constant.rb +26 -26
- data/lib/solargraph/source/chain/hash.rb +34 -34
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -291
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -166
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -498
- data/lib/solargraph/source_map/clip.rb +226 -226
- data/lib/solargraph/source_map/data.rb +34 -34
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -212
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -37
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -84
- data/lib/solargraph/type_checker.rb +814 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +255 -255
- data/lib/solargraph/workspace/require_paths.rb +97 -97
- data/lib/solargraph/workspace.rb +220 -220
- data/lib/solargraph/yard_map/helpers.rb +44 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -89
- data/lib/solargraph/yardoc.rb +87 -87
- data/lib/solargraph.rb +105 -105
- data/rbs_collection.yaml +1 -1
- metadata +12 -12
- /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
data/lib/solargraph/equality.rb
CHANGED
|
@@ -1,34 +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
|
-
# @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
|
+
# 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
|
data/lib/solargraph/gem_pins.rb
CHANGED
|
@@ -1,98 +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 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
|
+
# 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
|