steep 0.44.0 → 0.47.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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +8 -0
- data/.github/workflows/ruby.yml +3 -2
- data/.gitignore +0 -1
- data/CHANGELOG.md +42 -0
- data/Gemfile +0 -3
- data/Gemfile.lock +75 -0
- data/README.md +2 -1
- data/lib/steep/annotation_parser.rb +1 -1
- data/lib/steep/ast/builtin.rb +7 -1
- data/lib/steep/ast/types/factory.rb +19 -25
- data/lib/steep/cli.rb +7 -1
- data/lib/steep/diagnostic/lsp_formatter.rb +59 -6
- data/lib/steep/diagnostic/ruby.rb +188 -60
- data/lib/steep/diagnostic/signature.rb +38 -15
- data/lib/steep/drivers/check.rb +3 -0
- data/lib/steep/drivers/init.rb +10 -3
- data/lib/steep/drivers/utils/driver_helper.rb +15 -0
- data/lib/steep/drivers/validate.rb +1 -1
- data/lib/steep/drivers/watch.rb +3 -0
- data/lib/steep/equatable.rb +21 -0
- data/lib/steep/interface/function.rb +798 -579
- data/lib/steep/project/dsl.rb +135 -36
- data/lib/steep/project/options.rb +13 -53
- data/lib/steep/project/target.rb +22 -8
- data/lib/steep/server/interaction_worker.rb +245 -26
- data/lib/steep/server/master.rb +2 -2
- data/lib/steep/server/type_check_worker.rb +6 -9
- data/lib/steep/services/file_loader.rb +26 -19
- data/lib/steep/services/goto_service.rb +1 -0
- data/lib/steep/services/hover_content.rb +135 -80
- data/lib/steep/source.rb +12 -11
- data/lib/steep/type_construction.rb +435 -502
- data/lib/steep/type_inference/block_params.rb +3 -6
- data/lib/steep/type_inference/method_params.rb +483 -0
- data/lib/steep/type_inference/send_args.rb +599 -128
- data/lib/steep/typing.rb +46 -21
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +4 -2
- data/sample/Steepfile +10 -3
- data/smoke/alias/Steepfile +2 -1
- data/smoke/and/Steepfile +2 -1
- data/smoke/array/Steepfile +2 -1
- data/smoke/array/test_expectations.yml +3 -3
- data/smoke/block/Steepfile +2 -2
- data/smoke/block/c.rb +0 -1
- data/smoke/case/Steepfile +2 -1
- data/smoke/class/Steepfile +2 -1
- data/smoke/class/test_expectations.yml +12 -15
- data/smoke/const/Steepfile +2 -1
- data/smoke/diagnostics/Steepfile +2 -1
- data/smoke/diagnostics/different_method_parameter_kind.rb +9 -0
- data/smoke/diagnostics/method_arity_mismatch.rb +2 -2
- data/smoke/diagnostics/method_parameter_mismatch.rb +10 -0
- data/smoke/diagnostics/test_expectations.yml +108 -31
- data/smoke/diagnostics-rbs/Steepfile +1 -1
- data/smoke/diagnostics-rbs/mixin-class-error.rbs +6 -0
- data/smoke/diagnostics-rbs/test_expectations.yml +12 -0
- data/smoke/diagnostics-rbs-duplicated/Steepfile +2 -1
- data/smoke/diagnostics-ruby-unsat/Steepfile +2 -1
- data/smoke/dstr/Steepfile +2 -1
- data/smoke/ensure/Steepfile +2 -1
- data/smoke/ensure/test_expectations.yml +3 -3
- data/smoke/enumerator/Steepfile +2 -1
- data/smoke/enumerator/test_expectations.yml +1 -1
- data/smoke/extension/Steepfile +2 -1
- data/smoke/extension/e.rbs +1 -1
- data/smoke/hash/Steepfile +2 -1
- data/smoke/hello/Steepfile +2 -1
- data/smoke/if/Steepfile +2 -1
- data/smoke/implements/Steepfile +2 -1
- data/smoke/initialize/Steepfile +2 -1
- data/smoke/integer/Steepfile +2 -1
- data/smoke/interface/Steepfile +2 -1
- data/smoke/kwbegin/Steepfile +2 -1
- data/smoke/lambda/Steepfile +2 -1
- data/smoke/literal/Steepfile +2 -1
- data/smoke/literal/test_expectations.yml +2 -2
- data/smoke/map/Steepfile +2 -1
- data/smoke/method/Steepfile +2 -1
- data/smoke/method/test_expectations.yml +11 -10
- data/smoke/module/Steepfile +2 -1
- data/smoke/regexp/Steepfile +2 -1
- data/smoke/regression/Steepfile +2 -1
- data/smoke/rescue/Steepfile +2 -1
- data/smoke/rescue/test_expectations.yml +3 -3
- data/smoke/self/Steepfile +2 -1
- data/smoke/skip/Steepfile +2 -1
- data/smoke/stdout/Steepfile +2 -1
- data/smoke/super/Steepfile +2 -1
- data/smoke/toplevel/Steepfile +2 -1
- data/smoke/toplevel/test_expectations.yml +3 -3
- data/smoke/tsort/Steepfile +4 -5
- data/smoke/tsort/test_expectations.yml +2 -2
- data/smoke/type_case/Steepfile +2 -1
- data/smoke/unexpected/Steepfile +2 -1
- data/smoke/yield/Steepfile +2 -1
- data/steep.gemspec +2 -2
- metadata +16 -10
- data/sig/project.rbi +0 -109
@@ -71,46 +71,104 @@ module Steep
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
class
|
74
|
+
class UnexpectedPositionalArgument < Base
|
75
75
|
attr_reader :node
|
76
|
+
attr_reader :method_type
|
76
77
|
attr_reader :method_name
|
77
|
-
attr_reader :receiver_type
|
78
|
-
attr_reader :method_types
|
79
78
|
|
80
|
-
def initialize(node:, method_name:,
|
81
|
-
|
82
|
-
when :send
|
83
|
-
node.loc.selector
|
84
|
-
when :block
|
85
|
-
node.children[0].yield_self do |node|
|
86
|
-
node.loc.selector
|
87
|
-
end
|
88
|
-
when :super
|
89
|
-
node.loc.expression
|
90
|
-
else
|
91
|
-
Steep.logger.error { "Unexpected node given: #{node.type} (IncompatibleArguments#initialize)"}
|
92
|
-
node.loc.expression
|
93
|
-
end
|
94
|
-
super(node: node, location: location)
|
95
|
-
@receiver_type = receiver_type
|
96
|
-
@method_types = method_types
|
79
|
+
def initialize(node:, method_name:, method_type:)
|
80
|
+
super(node: node)
|
97
81
|
@method_name = method_name
|
82
|
+
@method_type = method_type
|
98
83
|
end
|
99
84
|
|
100
85
|
def header_line
|
101
|
-
"
|
86
|
+
"Unexpected positional argument"
|
102
87
|
end
|
88
|
+
end
|
103
89
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
90
|
+
class InsufficientPositionalArguments < Base
|
91
|
+
attr_reader :node
|
92
|
+
attr_reader :method_name
|
93
|
+
attr_reader :method_type
|
94
|
+
|
95
|
+
def initialize(node:, method_name:, method_type:)
|
96
|
+
send = case node.type
|
97
|
+
when :send, :csend
|
98
|
+
node
|
99
|
+
when :block, :numblock
|
100
|
+
node.children[0]
|
101
|
+
end
|
102
|
+
|
103
|
+
loc = if send
|
104
|
+
send.loc.selector.with(end_pos: send.loc.expression.end_pos)
|
105
|
+
else
|
106
|
+
node.loc.expression
|
107
|
+
end
|
108
|
+
|
109
|
+
super(node: node, location: loc)
|
110
|
+
@method_name = method_name
|
111
|
+
@method_type = method_type
|
112
|
+
end
|
113
|
+
|
114
|
+
def header_line
|
115
|
+
"More positional arguments are required"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class UnexpectedKeywordArgument < Base
|
120
|
+
attr_reader :node
|
121
|
+
attr_reader :method_name
|
122
|
+
attr_reader :method_type
|
123
|
+
|
124
|
+
def initialize(node:, method_name:, method_type:)
|
125
|
+
loc = case node.type
|
126
|
+
when :pair
|
127
|
+
node.children[0].location.expression
|
128
|
+
when :kwsplat
|
129
|
+
node.location.expression
|
130
|
+
else
|
131
|
+
raise
|
132
|
+
end
|
133
|
+
super(node: node, location: loc)
|
134
|
+
@method_name = method_name
|
135
|
+
@method_type = method_type
|
136
|
+
end
|
137
|
+
|
138
|
+
def header_line
|
139
|
+
"Unexpected keyword argument"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class InsufficientKeywordArguments < Base
|
144
|
+
attr_reader :node
|
145
|
+
attr_reader :method_name
|
146
|
+
attr_reader :method_type
|
147
|
+
attr_reader :missing_keywords
|
148
|
+
|
149
|
+
def initialize(node:, method_name:, method_type:, missing_keywords:)
|
150
|
+
send = case node.type
|
151
|
+
when :send, :csend
|
152
|
+
node
|
153
|
+
when :block, :numblock
|
154
|
+
node.children[0]
|
155
|
+
end
|
156
|
+
|
157
|
+
loc = if send
|
158
|
+
send.loc.selector.with(end_pos: send.loc.expression.end_pos)
|
159
|
+
else
|
160
|
+
node.loc.expression
|
161
|
+
end
|
162
|
+
|
163
|
+
super(node: node, location: loc)
|
164
|
+
|
165
|
+
@method_name = method_name
|
166
|
+
@method_type = method_type
|
167
|
+
@missing_keywords = missing_keywords
|
168
|
+
end
|
169
|
+
|
170
|
+
def header_line
|
171
|
+
"More keyword arguments are required: #{missing_keywords.join(", ")}"
|
114
172
|
end
|
115
173
|
end
|
116
174
|
|
@@ -292,6 +350,23 @@ module Steep
|
|
292
350
|
end
|
293
351
|
end
|
294
352
|
|
353
|
+
class ImplicitBreakValueMismatch < Base
|
354
|
+
attr_reader :jump_type
|
355
|
+
attr_reader :result
|
356
|
+
|
357
|
+
include ResultPrinter
|
358
|
+
|
359
|
+
def initialize(node:, jump_type:, result:)
|
360
|
+
super(node: node)
|
361
|
+
@jump_type = jump_type
|
362
|
+
@result = result
|
363
|
+
end
|
364
|
+
|
365
|
+
def header_line
|
366
|
+
"Breaking without a value may result an error because a value of type `#{jump_type}` is expected"
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
295
370
|
class UnexpectedJump < Base
|
296
371
|
def header_line
|
297
372
|
"Cannot jump from here"
|
@@ -323,6 +398,36 @@ module Steep
|
|
323
398
|
end
|
324
399
|
end
|
325
400
|
|
401
|
+
class MethodParameterMismatch < Base
|
402
|
+
attr_reader :method_param
|
403
|
+
attr_reader :method_type
|
404
|
+
|
405
|
+
def initialize(method_param:, method_type:)
|
406
|
+
super(node: method_param.node)
|
407
|
+
@method_param = method_param
|
408
|
+
@method_type = method_type
|
409
|
+
end
|
410
|
+
|
411
|
+
def header_line
|
412
|
+
"The method parameter is incompatible with the declaration `#{method_type}`"
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
class DifferentMethodParameterKind < Base
|
417
|
+
attr_reader :method_param
|
418
|
+
attr_reader :method_type
|
419
|
+
|
420
|
+
def initialize(method_param:, method_type:)
|
421
|
+
super(node: method_param.node)
|
422
|
+
@method_param = method_param
|
423
|
+
@method_type = method_type
|
424
|
+
end
|
425
|
+
|
426
|
+
def header_line
|
427
|
+
"The method parameter has different kind from the declaration `#{method_type}`"
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
326
431
|
class IncompatibleMethodTypeAnnotation < Base
|
327
432
|
attr_reader :interface_method
|
328
433
|
attr_reader :annotation_method
|
@@ -366,7 +471,7 @@ module Steep
|
|
366
471
|
include ResultPrinter
|
367
472
|
|
368
473
|
def initialize(node:, expected:, actual:, result:)
|
369
|
-
super(node: node)
|
474
|
+
super(node: node, location: node.loc.name)
|
370
475
|
@expected = expected
|
371
476
|
@actual = actual
|
372
477
|
@result = result
|
@@ -552,34 +657,6 @@ module Steep
|
|
552
657
|
end
|
553
658
|
end
|
554
659
|
|
555
|
-
class UnexpectedKeyword < Base
|
556
|
-
attr_reader :unexpected_keywords
|
557
|
-
|
558
|
-
def initialize(node:, unexpected_keywords:)
|
559
|
-
super(node: node)
|
560
|
-
@unexpected_keywords = unexpected_keywords
|
561
|
-
end
|
562
|
-
|
563
|
-
def header_line
|
564
|
-
keywords = unexpected_keywords.sort.map {|x| "`#{x}`" }
|
565
|
-
"Cannot specify unexpected keyword arguments: #{keywords.join(", ")}"
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
class MissingKeyword < Base
|
570
|
-
attr_reader :missing_keywords
|
571
|
-
|
572
|
-
def initialize(node:, missing_keywords:)
|
573
|
-
super(node: node)
|
574
|
-
@missing_keywords = missing_keywords
|
575
|
-
end
|
576
|
-
|
577
|
-
def header_line
|
578
|
-
keywords = missing_keywords.sort.map {|x| "`#{x}`" }
|
579
|
-
"Cannot omit required keywords: #{keywords.join(", ")}"
|
580
|
-
end
|
581
|
-
end
|
582
|
-
|
583
660
|
class UnsupportedSyntax < Base
|
584
661
|
attr_reader :message
|
585
662
|
|
@@ -623,6 +700,57 @@ module Steep
|
|
623
700
|
"SyntaxError: #{message}"
|
624
701
|
end
|
625
702
|
end
|
703
|
+
|
704
|
+
ALL = ObjectSpace.each_object(Class).with_object([]) do |klass, array|
|
705
|
+
if klass < Base
|
706
|
+
array << klass
|
707
|
+
end
|
708
|
+
end
|
709
|
+
|
710
|
+
def self.all_error
|
711
|
+
@all_error ||= ALL.each.with_object({}) do |klass, hash|
|
712
|
+
hash[klass] = LSPFormatter::ERROR
|
713
|
+
end.freeze
|
714
|
+
end
|
715
|
+
|
716
|
+
def self.default
|
717
|
+
@default ||= all_error.merge(
|
718
|
+
{
|
719
|
+
ImplicitBreakValueMismatch => :warning,
|
720
|
+
FallbackAny => :information,
|
721
|
+
ElseOnExhaustiveCase => :warning,
|
722
|
+
UnknownConstantAssigned => :warning,
|
723
|
+
MethodDefinitionMissing => :information
|
724
|
+
}
|
725
|
+
).freeze
|
726
|
+
end
|
727
|
+
|
728
|
+
def self.strict
|
729
|
+
@strict ||= all_error.merge(
|
730
|
+
{
|
731
|
+
NoMethod => nil,
|
732
|
+
ImplicitBreakValueMismatch => nil,
|
733
|
+
FallbackAny => nil,
|
734
|
+
ElseOnExhaustiveCase => nil,
|
735
|
+
UnknownConstantAssigned => nil,
|
736
|
+
MethodDefinitionMissing => nil
|
737
|
+
}
|
738
|
+
).freeze
|
739
|
+
end
|
740
|
+
|
741
|
+
def self.lenient
|
742
|
+
@lenient ||= all_error.merge(
|
743
|
+
{
|
744
|
+
NoMethod => nil,
|
745
|
+
ImplicitBreakValueMismatch => nil,
|
746
|
+
FallbackAny => nil,
|
747
|
+
ElseOnExhaustiveCase => nil,
|
748
|
+
UnknownConstantAssigned => nil,
|
749
|
+
MethodDefinitionMissing => nil,
|
750
|
+
UnexpectedJump => nil
|
751
|
+
}
|
752
|
+
).freeze
|
753
|
+
end
|
626
754
|
end
|
627
755
|
end
|
628
756
|
end
|
@@ -38,25 +38,16 @@ module Steep
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.parser_syntax_error_message(exception)
|
41
|
-
|
42
|
-
exception.error_value.value
|
43
|
-
else
|
44
|
-
exception.error_value
|
45
|
-
end
|
46
|
-
string = value.to_s
|
41
|
+
string = exception.location.source.to_s
|
47
42
|
unless string.empty?
|
48
43
|
string = " (#{string})"
|
49
44
|
end
|
50
45
|
|
51
|
-
"Syntax error caused by token `#{exception.
|
46
|
+
"Syntax error caused by token `#{exception.token_type}`#{string}"
|
52
47
|
end
|
53
48
|
|
54
49
|
def header_line
|
55
|
-
|
56
|
-
SyntaxError.parser_syntax_error_message(exception)
|
57
|
-
else
|
58
|
-
exception.message
|
59
|
-
end
|
50
|
+
exception.message
|
60
51
|
end
|
61
52
|
end
|
62
53
|
|
@@ -275,6 +266,34 @@ module Steep
|
|
275
266
|
end
|
276
267
|
end
|
277
268
|
|
269
|
+
class MixinClassError < Base
|
270
|
+
attr_reader :member
|
271
|
+
attr_reader :type_name
|
272
|
+
|
273
|
+
def initialize(location:, member:, type_name:)
|
274
|
+
super(location: location)
|
275
|
+
@member = member
|
276
|
+
@type_name = type_name
|
277
|
+
end
|
278
|
+
|
279
|
+
def header_line
|
280
|
+
"Cannot #{mixin_name} a class `#{member.name}` in the definition of `#{type_name}`"
|
281
|
+
end
|
282
|
+
|
283
|
+
private
|
284
|
+
|
285
|
+
def mixin_name
|
286
|
+
case member
|
287
|
+
when RBS::AST::Members::Prepend
|
288
|
+
"prepend"
|
289
|
+
when RBS::AST::Members::Include
|
290
|
+
"include"
|
291
|
+
when RBS::AST::Members::Extend
|
292
|
+
"extend"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
278
297
|
class UnexpectedError < Base
|
279
298
|
attr_reader :message
|
280
299
|
|
@@ -290,10 +309,8 @@ module Steep
|
|
290
309
|
|
291
310
|
def self.from_rbs_error(error, factory:)
|
292
311
|
case error
|
293
|
-
when RBS::
|
312
|
+
when RBS::ParsingError
|
294
313
|
Diagnostic::Signature::SyntaxError.new(error, location: error.location)
|
295
|
-
when RBS::Parser::SyntaxError
|
296
|
-
Diagnostic::Signature::SyntaxError.new(error, location: error.error_value.location)
|
297
314
|
when RBS::DuplicatedDeclarationError
|
298
315
|
Diagnostic::Signature::DuplicatedDeclaration.new(
|
299
316
|
type_name: error.name,
|
@@ -365,6 +382,12 @@ module Steep
|
|
365
382
|
param: error.param,
|
366
383
|
location: error.location
|
367
384
|
)
|
385
|
+
when RBS::MixinClassError
|
386
|
+
Diagnostic::Signature::MixinClassError.new(
|
387
|
+
location: error.location,
|
388
|
+
type_name: error.type_name,
|
389
|
+
member: error.member,
|
390
|
+
)
|
368
391
|
else
|
369
392
|
raise error
|
370
393
|
end
|
data/lib/steep/drivers/check.rb
CHANGED
@@ -8,6 +8,7 @@ module Steep
|
|
8
8
|
attr_reader :command_line_patterns
|
9
9
|
attr_accessor :with_expectations_path
|
10
10
|
attr_accessor :save_expectations_path
|
11
|
+
attr_accessor :severity_level
|
11
12
|
|
12
13
|
include Utils::DriverHelper
|
13
14
|
include Utils::JobsCount
|
@@ -16,6 +17,7 @@ module Steep
|
|
16
17
|
@stdout = stdout
|
17
18
|
@stderr = stderr
|
18
19
|
@command_line_patterns = []
|
20
|
+
@severity_level = :warning
|
19
21
|
end
|
20
22
|
|
21
23
|
def run
|
@@ -70,6 +72,7 @@ module Steep
|
|
70
72
|
case
|
71
73
|
when response[:method] == "textDocument/publishDiagnostics"
|
72
74
|
ds = response[:params][:diagnostics]
|
75
|
+
ds.select! {|d| keep_diagnostic?(d) }
|
73
76
|
if ds.empty?
|
74
77
|
stdout.print "."
|
75
78
|
else
|
data/lib/steep/drivers/init.rb
CHANGED
@@ -8,6 +8,8 @@ module Steep
|
|
8
8
|
include Utils::DriverHelper
|
9
9
|
|
10
10
|
TEMPLATE = <<~EOF
|
11
|
+
# D = Steep::Diagnostic
|
12
|
+
#
|
11
13
|
# target :lib do
|
12
14
|
# signature "sig"
|
13
15
|
#
|
@@ -18,15 +20,20 @@ module Steep
|
|
18
20
|
#
|
19
21
|
# # library "pathname", "set" # Standard libraries
|
20
22
|
# # library "strong_json" # Gems
|
23
|
+
#
|
24
|
+
# # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
|
25
|
+
# # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
|
26
|
+
# # configure_code_diagnostics do |hash| # You can setup everything yourself
|
27
|
+
# # hash[D::Ruby::NoMethod] = :information
|
28
|
+
# # end
|
21
29
|
# end
|
22
30
|
|
23
|
-
# target :
|
31
|
+
# target :test do
|
24
32
|
# signature "sig", "sig-private"
|
25
33
|
#
|
26
|
-
# check "
|
34
|
+
# check "test"
|
27
35
|
#
|
28
36
|
# # library "pathname", "set" # Standard libraries
|
29
|
-
# # library "rspec"
|
30
37
|
# end
|
31
38
|
EOF
|
32
39
|
|
@@ -55,6 +55,21 @@ module Steep
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
def keep_diagnostic?(diagnostic)
|
60
|
+
severity = diagnostic[:severity]
|
61
|
+
|
62
|
+
case self.severity_level
|
63
|
+
when nil, :hint
|
64
|
+
true
|
65
|
+
when :error
|
66
|
+
severity <= LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR
|
67
|
+
when :warning
|
68
|
+
severity <= LanguageServer::Protocol::Constant::DiagnosticSeverity::WARNING
|
69
|
+
when :information
|
70
|
+
severity <= LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION
|
71
|
+
end
|
72
|
+
end
|
58
73
|
end
|
59
74
|
end
|
60
75
|
end
|
@@ -36,7 +36,7 @@ module Steep
|
|
36
36
|
|
37
37
|
any_error ||= !errors.empty?
|
38
38
|
|
39
|
-
formatter = Diagnostic::LSPFormatter.new
|
39
|
+
formatter = Diagnostic::LSPFormatter.new({})
|
40
40
|
diagnostics = errors.group_by {|e| e.location.buffer }.transform_values do |errors|
|
41
41
|
errors.map {|error| formatter.format(error) }
|
42
42
|
end
|
data/lib/steep/drivers/watch.rb
CHANGED
@@ -5,6 +5,7 @@ module Steep
|
|
5
5
|
attr_reader :stdout
|
6
6
|
attr_reader :stderr
|
7
7
|
attr_reader :queue
|
8
|
+
attr_accessor :severity_level
|
8
9
|
|
9
10
|
include Utils::DriverHelper
|
10
11
|
include Utils::JobsCount
|
@@ -16,6 +17,7 @@ module Steep
|
|
16
17
|
@stdout = stdout
|
17
18
|
@stderr = stderr
|
18
19
|
@queue = Thread::Queue.new
|
20
|
+
@severity_level = :warning
|
19
21
|
end
|
20
22
|
|
21
23
|
def watching?(changed_path, files:, dirs:)
|
@@ -126,6 +128,7 @@ module Steep
|
|
126
128
|
printer = DiagnosticPrinter.new(stdout: stdout, buffer: buffer)
|
127
129
|
|
128
130
|
diagnostics = response[:params][:diagnostics]
|
131
|
+
diagnostics.filter! {|d| keep_diagnostic?(d) }
|
129
132
|
|
130
133
|
unless diagnostics.empty?
|
131
134
|
diagnostics.each do |diagnostic|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Steep
|
2
|
+
module Equatable
|
3
|
+
def ==(other)
|
4
|
+
if other.class == self.class
|
5
|
+
instance_variables.all? do |name|
|
6
|
+
other.instance_variable_get(name) == instance_variable_get(name)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def eql?(other)
|
12
|
+
self == other
|
13
|
+
end
|
14
|
+
|
15
|
+
def hash
|
16
|
+
instance_variables.inject(self.class.hash) do |hash, name|
|
17
|
+
hash ^ instance_variable_get(name).hash
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|