steep 0.39.0 → 0.40.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/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/Rakefile +5 -2
- data/bin/output_rebaseline.rb +49 -0
- data/bin/output_test.rb +93 -0
- data/lib/steep.rb +8 -3
- data/lib/steep/cli.rb +1 -1
- data/lib/steep/diagnostic/helper.rb +17 -0
- data/lib/steep/diagnostic/lsp_formatter.rb +16 -0
- data/lib/steep/diagnostic/ruby.rb +623 -0
- data/lib/steep/diagnostic/signature.rb +224 -0
- data/lib/steep/drivers/annotations.rb +13 -6
- data/lib/steep/drivers/check.rb +83 -60
- data/lib/steep/drivers/diagnostic_printer.rb +94 -0
- data/lib/steep/drivers/stats.rb +125 -29
- data/lib/steep/drivers/trace_printer.rb +5 -1
- data/lib/steep/drivers/validate.rb +13 -6
- data/lib/steep/drivers/watch.rb +26 -9
- data/lib/steep/drivers/worker.rb +5 -0
- data/lib/steep/project/options.rb +4 -4
- data/lib/steep/project/signature_file.rb +8 -2
- data/lib/steep/project/stats_calculator.rb +80 -0
- data/lib/steep/project/target.rb +64 -53
- data/lib/steep/range_extension.rb +29 -0
- data/lib/steep/server/base_worker.rb +42 -4
- data/lib/steep/server/code_worker.rb +37 -24
- data/lib/steep/server/interaction_worker.rb +1 -0
- data/lib/steep/server/master.rb +268 -82
- data/lib/steep/server/signature_worker.rb +7 -59
- data/lib/steep/server/worker_process.rb +9 -9
- data/lib/steep/signature/validator.rb +33 -9
- data/lib/steep/type_construction.rb +276 -194
- data/lib/steep/version.rb +1 -1
- data/smoke/alias/a.rb +0 -3
- data/smoke/alias/b.rb +0 -1
- data/smoke/alias/c.rb +0 -2
- data/smoke/alias/test.yaml +73 -0
- data/smoke/and/a.rb +0 -3
- data/smoke/and/test.yaml +24 -0
- data/smoke/array/a.rb +0 -3
- data/smoke/array/b.rb +0 -2
- data/smoke/array/c.rb +0 -1
- data/smoke/array/test.yaml +80 -0
- data/smoke/block/a.rb +0 -2
- data/smoke/block/b.rb +0 -2
- data/smoke/block/d.rb +0 -4
- data/smoke/block/test.yaml +96 -0
- data/smoke/broken/Steepfile +5 -0
- data/smoke/broken/broken.rb +0 -0
- data/smoke/broken/broken.rbs +0 -0
- data/smoke/broken/test.yaml +6 -0
- data/smoke/case/a.rb +0 -3
- data/smoke/case/test.yaml +36 -0
- data/smoke/class/a.rb +0 -3
- data/smoke/class/c.rb +0 -1
- data/smoke/class/f.rb +0 -1
- data/smoke/class/g.rb +0 -2
- data/smoke/class/i.rb +0 -2
- data/smoke/class/test.yaml +89 -0
- data/smoke/const/a.rb +0 -3
- data/smoke/const/b.rb +7 -0
- data/smoke/const/b.rbs +5 -0
- data/smoke/const/test.yaml +96 -0
- data/smoke/diagnostics-rbs-duplicated/Steepfile +5 -0
- data/smoke/diagnostics-rbs-duplicated/a.rbs +5 -0
- data/smoke/diagnostics-rbs-duplicated/test.yaml +10 -0
- data/smoke/diagnostics-rbs/Steepfile +5 -0
- data/smoke/diagnostics-rbs/duplicated-method-definition.rbs +20 -0
- data/smoke/diagnostics-rbs/generic-parameter-mismatch.rbs +7 -0
- data/smoke/diagnostics-rbs/invalid-method-overload.rbs +3 -0
- data/smoke/diagnostics-rbs/invalid-type-application.rbs +7 -0
- data/smoke/diagnostics-rbs/invalid_variance_annotation.rbs +3 -0
- data/smoke/diagnostics-rbs/recursive-alias.rbs +5 -0
- data/smoke/diagnostics-rbs/recursive-class.rbs +8 -0
- data/smoke/diagnostics-rbs/superclass-mismatch.rbs +7 -0
- data/smoke/diagnostics-rbs/test.yaml +142 -0
- data/smoke/diagnostics-rbs/unknown-method-alias.rbs +3 -0
- data/smoke/diagnostics-rbs/unknown-type-name.rbs +13 -0
- data/smoke/diagnostics/Steepfile +5 -0
- data/smoke/diagnostics/a.rbs +26 -0
- data/smoke/diagnostics/argument_type_mismatch.rb +1 -0
- data/smoke/diagnostics/block_body_type_mismatch.rb +1 -0
- data/smoke/diagnostics/block_type_mismatch.rb +3 -0
- data/smoke/diagnostics/break_type_mismatch.rb +1 -0
- data/smoke/diagnostics/else_on_exhaustive_case.rb +12 -0
- data/smoke/diagnostics/incompatible_annotation.rb +6 -0
- data/smoke/diagnostics/incompatible_argument.rb +1 -0
- data/smoke/diagnostics/incompatible_assignment.rb +8 -0
- data/smoke/diagnostics/method_arity_mismatch.rb +11 -0
- data/smoke/diagnostics/method_body_type_mismatch.rb +6 -0
- data/smoke/diagnostics/method_definition_missing.rb +2 -0
- data/smoke/diagnostics/method_return_type_annotation_mismatch.rb +7 -0
- data/smoke/diagnostics/missing_keyword.rb +1 -0
- data/smoke/diagnostics/no_method.rb +1 -0
- data/smoke/diagnostics/required_block_missing.rb +1 -0
- data/smoke/diagnostics/return_type_mismatch.rb +6 -0
- data/smoke/diagnostics/test.yaml +333 -0
- data/smoke/diagnostics/unexpected_block_given.rb +1 -0
- data/smoke/diagnostics/unexpected_dynamic_method.rb +3 -0
- data/smoke/diagnostics/unexpected_jump.rb +4 -0
- data/smoke/diagnostics/unexpected_jump_value.rb +3 -0
- data/smoke/diagnostics/unexpected_keyword.rb +1 -0
- data/smoke/diagnostics/unexpected_splat.rb +1 -0
- data/smoke/diagnostics/unexpected_yield.rb +6 -0
- data/smoke/diagnostics/unknown_constant_assigned.rb +7 -0
- data/smoke/diagnostics/unresolved_overloading.rb +1 -0
- data/smoke/diagnostics/unsatisfiable_constraint.rb +7 -0
- data/smoke/diagnostics/unsupported_syntax.rb +2 -0
- data/smoke/dstr/a.rb +0 -1
- data/smoke/dstr/test.yaml +10 -0
- data/smoke/ensure/a.rb +0 -4
- data/smoke/ensure/test.yaml +47 -0
- data/smoke/enumerator/a.rb +0 -6
- data/smoke/enumerator/b.rb +0 -3
- data/smoke/enumerator/test.yaml +100 -0
- data/smoke/extension/a.rb +0 -1
- data/smoke/extension/b.rb +0 -2
- data/smoke/extension/c.rb +0 -1
- data/smoke/extension/test.yaml +50 -0
- data/smoke/hash/b.rb +0 -1
- data/smoke/hash/c.rb +0 -3
- data/smoke/hash/d.rb +0 -1
- data/smoke/hash/e.rb +0 -1
- data/smoke/hash/test.yaml +62 -0
- data/smoke/hello/hello.rb +0 -2
- data/smoke/hello/test.yaml +18 -0
- data/smoke/if/a.rb +0 -2
- data/smoke/if/test.yaml +27 -0
- data/smoke/implements/a.rb +0 -2
- data/smoke/implements/test.yaml +16 -0
- data/smoke/initialize/test.yaml +4 -0
- data/smoke/integer/a.rb +0 -7
- data/smoke/integer/test.yaml +66 -0
- data/smoke/interface/a.rb +0 -2
- data/smoke/interface/test.yaml +16 -0
- data/smoke/kwbegin/a.rb +0 -1
- data/smoke/kwbegin/test.yaml +14 -0
- data/smoke/lambda/a.rb +1 -4
- data/smoke/lambda/test.yaml +28 -0
- data/smoke/literal/a.rb +0 -5
- data/smoke/literal/b.rb +0 -2
- data/smoke/literal/test.yaml +79 -0
- data/smoke/map/test.yaml +4 -0
- data/smoke/method/a.rb +0 -5
- data/smoke/method/b.rb +0 -1
- data/smoke/method/test.yaml +71 -0
- data/smoke/module/a.rb +0 -2
- data/smoke/module/b.rb +0 -2
- data/smoke/module/c.rb +0 -1
- data/smoke/module/d.rb +0 -1
- data/smoke/module/f.rb +0 -2
- data/smoke/module/test.yaml +51 -0
- data/smoke/regexp/a.rb +0 -38
- data/smoke/regexp/b.rb +0 -26
- data/smoke/regexp/test.yaml +372 -0
- data/smoke/regression/set_divide.rb +0 -4
- data/smoke/regression/test.yaml +38 -0
- data/smoke/rescue/a.rb +0 -5
- data/smoke/rescue/test.yaml +60 -0
- data/smoke/self/a.rb +0 -2
- data/smoke/self/test.yaml +16 -0
- data/smoke/skip/skip.rb +0 -2
- data/smoke/skip/test.yaml +16 -0
- data/smoke/stdout/test.yaml +4 -0
- data/smoke/super/a.rb +0 -4
- data/smoke/super/test.yaml +52 -0
- data/smoke/toplevel/a.rb +0 -1
- data/smoke/toplevel/test.yaml +12 -0
- data/smoke/tsort/a.rb +0 -3
- data/smoke/tsort/test.yaml +32 -0
- data/smoke/type_case/a.rb +0 -4
- data/smoke/type_case/test.yaml +33 -0
- data/smoke/yield/a.rb +0 -3
- data/smoke/yield/b.rb +6 -0
- data/smoke/yield/test.yaml +49 -0
- data/steep.gemspec +3 -3
- metadata +108 -17
- data/bin/smoke_runner.rb +0 -139
- data/lib/steep/drivers/signature_error_printer.rb +0 -25
- data/lib/steep/errors.rb +0 -594
- data/lib/steep/signature/errors.rb +0 -128
- data/lib/steep/type_assignability.rb +0 -367
data/smoke/method/b.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
---
|
2
|
+
test:
|
3
|
+
a.rb:
|
4
|
+
diagnostics:
|
5
|
+
- |
|
6
|
+
a.rb:6:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
|
7
|
+
│ ::Integer <: ::String
|
8
|
+
│ ::Numeric <: ::String
|
9
|
+
│ ::Object <: ::String
|
10
|
+
│ ::BasicObject <: ::String
|
11
|
+
│
|
12
|
+
│ Diagnostic ID: Ruby::IncompatibleAssignment
|
13
|
+
│
|
14
|
+
└ z = x
|
15
|
+
~~~~~
|
16
|
+
- |
|
17
|
+
a.rb:8:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
|
18
|
+
│ ::Integer <: ::String
|
19
|
+
│ ::Numeric <: ::String
|
20
|
+
│ ::Object <: ::String
|
21
|
+
│ ::BasicObject <: ::String
|
22
|
+
│
|
23
|
+
│ Diagnostic ID: Ruby::IncompatibleAssignment
|
24
|
+
│
|
25
|
+
└ z = y
|
26
|
+
~~~~~
|
27
|
+
- |
|
28
|
+
a.rb:3:0: [error] Cannot allow method body have type `::Integer` because declared as type `::String`
|
29
|
+
│ ::Integer <: ::String
|
30
|
+
│ ::Numeric <: ::String
|
31
|
+
│ ::Object <: ::String
|
32
|
+
│ ::BasicObject <: ::String
|
33
|
+
│
|
34
|
+
│ Diagnostic ID: Ruby::MethodBodyTypeMismatch
|
35
|
+
│
|
36
|
+
└ def foo(x, y:)
|
37
|
+
~~~~~~~~~~~~~~
|
38
|
+
- |
|
39
|
+
a.rb:15:7: [error] Method parameters are incompatible with declaration `(::Integer) -> ::String`
|
40
|
+
│ Diagnostic ID: Ruby::MethodArityMismatch
|
41
|
+
│
|
42
|
+
└ def bar(x, y)
|
43
|
+
~~~~~~
|
44
|
+
- |
|
45
|
+
a.rb:18:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
|
46
|
+
│ ::Integer <: ::String
|
47
|
+
│ ::Numeric <: ::String
|
48
|
+
│ ::Object <: ::String
|
49
|
+
│ ::BasicObject <: ::String
|
50
|
+
│
|
51
|
+
│ Diagnostic ID: Ruby::IncompatibleAssignment
|
52
|
+
│
|
53
|
+
└ z = x
|
54
|
+
~~~~~
|
55
|
+
b.rb:
|
56
|
+
diagnostics:
|
57
|
+
- |
|
58
|
+
b.rb:4:2: [error] Cannot allow method body have type `::Symbol` because declared as type `(::Integer | ::String)`
|
59
|
+
│ ::Symbol <: (::Integer | ::String)
|
60
|
+
│ ::Symbol <: ::Integer
|
61
|
+
│ ::Object <: ::Integer
|
62
|
+
│ ::BasicObject <: ::Integer
|
63
|
+
│
|
64
|
+
│ Diagnostic ID: Ruby::MethodBodyTypeMismatch
|
65
|
+
│
|
66
|
+
└ def foo(x)
|
67
|
+
~~~~~~~~~~
|
68
|
+
c.rb:
|
69
|
+
diagnostics: []
|
70
|
+
d.rb:
|
71
|
+
diagnostics: []
|
data/smoke/module/a.rb
CHANGED
data/smoke/module/b.rb
CHANGED
data/smoke/module/c.rb
CHANGED
data/smoke/module/d.rb
CHANGED
data/smoke/module/f.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
test:
|
3
|
+
a.rb:
|
4
|
+
diagnostics:
|
5
|
+
- |
|
6
|
+
a.rb:13:4: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
|
7
|
+
│ ::Integer <: ::String
|
8
|
+
│ ::Numeric <: ::String
|
9
|
+
│ ::Object <: ::String
|
10
|
+
│ ::BasicObject <: ::String
|
11
|
+
│
|
12
|
+
│ Diagnostic ID: Ruby::IncompatibleAssignment
|
13
|
+
│
|
14
|
+
└ s = n
|
15
|
+
~~~~~
|
16
|
+
- |
|
17
|
+
a.rb:15:4: [error] Type `(::Object & ::_Each2[::Integer, ::A] & ::A)` does not have method `foo`
|
18
|
+
│ Diagnostic ID: Ruby::NoMethod
|
19
|
+
│
|
20
|
+
└ foo()
|
21
|
+
~~~
|
22
|
+
c.rb:
|
23
|
+
diagnostics:
|
24
|
+
- |
|
25
|
+
c.rb:21:2: [error] Type `singleton(::A)` does not have method `no_such_method_in_module`
|
26
|
+
│ Diagnostic ID: Ruby::NoMethod
|
27
|
+
│
|
28
|
+
└ no_such_method_in_module
|
29
|
+
~~~~~~~~~~~~~~~~~~~~~~~~
|
30
|
+
d.rb:
|
31
|
+
diagnostics:
|
32
|
+
- |
|
33
|
+
d.rb:3:7: [error] Cannot find implementation of method `::X#foo`
|
34
|
+
│ Diagnostic ID: Ruby::MethodDefinitionMissing
|
35
|
+
│
|
36
|
+
└ module X
|
37
|
+
~
|
38
|
+
f.rb:
|
39
|
+
diagnostics:
|
40
|
+
- |
|
41
|
+
f.rb:1:7: [error] Cannot find implementation of method `::Palette.nestopia_palette`
|
42
|
+
│ Diagnostic ID: Ruby::MethodDefinitionMissing
|
43
|
+
│
|
44
|
+
└ module Palette
|
45
|
+
~~~~~~~
|
46
|
+
- |
|
47
|
+
f.rb:1:7: [error] @dynamic annotation contains unknown method name `nestopia_palette`
|
48
|
+
│ Diagnostic ID: Ruby::UnexpectedDynamicMethod
|
49
|
+
│
|
50
|
+
└ module Palette
|
51
|
+
~~~~~~~
|
data/smoke/regexp/a.rb
CHANGED
@@ -1,147 +1,109 @@
|
|
1
|
-
# ALLOW FAILURE
|
2
|
-
|
3
1
|
new_1 = Regexp.new("a")
|
4
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
5
2
|
new_1.foo
|
6
3
|
|
7
4
|
new_2 = Regexp.new("a", true)
|
8
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
9
5
|
new_2.foo
|
10
6
|
|
11
7
|
new_3 = Regexp.new("a", Regexp::EXTENDED | Regexp::IGNORECASE)
|
12
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
13
8
|
new_3.foo
|
14
9
|
|
15
10
|
new_4 = Regexp.new(/a/)
|
16
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
17
11
|
new_4.foo
|
18
12
|
|
19
13
|
compile_1 = Regexp.compile("a")
|
20
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
21
14
|
compile_1.foo
|
22
15
|
|
23
16
|
compile_2 = Regexp.compile("a", true)
|
24
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
25
17
|
compile_2.foo
|
26
18
|
|
27
19
|
compile_3 = Regexp.compile("a", Regexp::EXTENDED | Regexp::IGNORECASE)
|
28
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
29
20
|
compile_3.foo
|
30
21
|
|
31
22
|
compile_4 = Regexp.compile(/a/)
|
32
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
33
23
|
compile_4.foo
|
34
24
|
|
35
25
|
escape_1 = Regexp.escape("a")
|
36
|
-
# !expects NoMethodError: type=::String, method=foo
|
37
26
|
escape_1.foo
|
38
27
|
|
39
28
|
last_match_1 = Regexp.last_match
|
40
|
-
# !expects NoMethodError: type=(::MatchData | nil), method=foo
|
41
29
|
last_match_1.foo
|
42
30
|
|
43
31
|
last_match_2 = Regexp.last_match(1)
|
44
|
-
# !expects NoMethodError: type=(::String | nil), method=foo
|
45
32
|
last_match_2.foo
|
46
33
|
|
47
34
|
quote_1 = Regexp.quote("a")
|
48
|
-
# !expects NoMethodError: type=::String, method=foo
|
49
35
|
quote_1.foo
|
50
36
|
|
51
37
|
try_convert_1 = Regexp.try_convert(Object.new)
|
52
|
-
# !expects NoMethodError: type=(::Regexp | nil), method=foo
|
53
38
|
try_convert_1.foo
|
54
39
|
|
55
40
|
union_1 = Regexp.union
|
56
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
57
41
|
union_1.foo
|
58
42
|
|
59
43
|
union_2 = Regexp.union("a")
|
60
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
61
44
|
union_2.foo
|
62
45
|
|
63
46
|
union_3 = Regexp.union("a", "b")
|
64
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
65
47
|
union_3.foo
|
66
48
|
|
67
49
|
union_4 = Regexp.union(["a", "b"])
|
68
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
69
50
|
union_4.foo
|
70
51
|
|
71
52
|
union_5 = Regexp.union(/a/)
|
72
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
73
53
|
union_5.foo
|
74
54
|
|
75
55
|
union_6 = Regexp.union(/a/, /b/)
|
76
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
77
56
|
union_6.foo
|
78
57
|
|
79
58
|
union_7 = Regexp.union([/a/, /b/])
|
80
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
81
59
|
union_7.foo
|
82
60
|
|
83
61
|
op_eqeqeq_1 = /a/ === "a"
|
84
|
-
# !expects NoMethodError: type=bool, method=foo
|
85
62
|
op_eqeqeq_1.foo
|
86
63
|
|
87
64
|
op_match_1 = /a/ =~ "a"
|
88
|
-
# !expects NoMethodError: type=::Integer, method=foo
|
89
65
|
op_match_1.foo
|
90
66
|
|
91
67
|
casefold_1 = /a/.casefold?
|
92
|
-
# !expects NoMethodError: type=bool, method=foo
|
93
68
|
casefold_1.foo
|
94
69
|
|
95
70
|
encoding_1 = /a/.encoding
|
96
|
-
# !expects NoMethodError: type=::Encoding, method=foo
|
97
71
|
encoding_1.foo
|
98
72
|
|
99
73
|
fixed_encoding_1 = /a/.fixed_encoding?
|
100
|
-
# !expects NoMethodError: type=bool, method=foo
|
101
74
|
fixed_encoding_1.foo
|
102
75
|
|
103
76
|
match_1 = /a/.match("a")
|
104
|
-
# !expects NoMethodError: type=(::MatchData | nil), method=foo
|
105
77
|
match_1.foo
|
106
78
|
|
107
79
|
match_2 = /a/.match("a", 0)
|
108
|
-
# !expects NoMethodError: type=(::MatchData | nil), method=foo
|
109
80
|
match_2.foo
|
110
81
|
|
111
82
|
/a/.match("a") do |m|
|
112
|
-
# !expects NoMethodError: type=::MatchData, method=foo
|
113
83
|
m.foo
|
114
84
|
end
|
115
85
|
|
116
86
|
/a/.match("a", 0) do |m|
|
117
|
-
# !expects NoMethodError: type=::MatchData, method=foo
|
118
87
|
m.foo
|
119
88
|
end
|
120
89
|
|
121
90
|
match_q_1 = /a/.match?("a")
|
122
|
-
# !expects NoMethodError: type=bool, method=foo
|
123
91
|
match_q_1.foo
|
124
92
|
|
125
93
|
match_q_2 = /a/.match?("a", 0)
|
126
|
-
# !expects NoMethodError: type=bool, method=foo
|
127
94
|
match_q_2.foo
|
128
95
|
|
129
96
|
named_captures_1 = /(?<foo>.)/.named_captures
|
130
|
-
# !expects NoMethodError: type=::Hash[::String, ::Array[::Integer]], method=foo
|
131
97
|
named_captures_1.foo
|
132
98
|
|
133
99
|
names_1 = /(?<foo>.)/.names
|
134
|
-
# !expects NoMethodError: type=::Array[::String], method=foo
|
135
100
|
names_1.foo
|
136
101
|
|
137
102
|
options_1 = /a/ix.options
|
138
|
-
# !expects NoMethodError: type=::Integer, method=foo
|
139
103
|
options_1.foo
|
140
104
|
|
141
105
|
source_1 = /a/ix.source
|
142
|
-
# !expects NoMethodError: type=::String, method=foo
|
143
106
|
source_1.foo
|
144
107
|
|
145
108
|
op_unary_match_1 = ~ /a/
|
146
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
147
109
|
op_unary_match_1.foo
|
data/smoke/regexp/b.rb
CHANGED
@@ -1,105 +1,79 @@
|
|
1
1
|
/(?<foo>a)/.match("a") do |match|
|
2
2
|
match_ref_1 = match[0]
|
3
|
-
# !expects NoMethodError: type=(::String | nil), method=foo
|
4
3
|
match_ref_1.foo
|
5
4
|
|
6
5
|
match_ref_2 = match["foo"]
|
7
|
-
# !expects NoMethodError: type=(::String | nil), method=foo
|
8
6
|
match_ref_2.foo
|
9
7
|
|
10
8
|
match_ref_3 = match[:foo]
|
11
|
-
# !expects NoMethodError: type=(::String | nil), method=foo
|
12
9
|
match_ref_3.foo
|
13
10
|
|
14
11
|
match_ref_4 = match[0, 1]
|
15
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
16
12
|
match_ref_4.foo
|
17
13
|
|
18
14
|
match_ref_5 = match[0..1]
|
19
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
20
15
|
match_ref_5.foo
|
21
16
|
|
22
17
|
begin_1 = match.begin(0)
|
23
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
24
18
|
begin_1.foo
|
25
19
|
|
26
20
|
begin_2 = match.begin("foo")
|
27
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
28
21
|
begin_2.foo
|
29
22
|
|
30
23
|
begin_3 = match.begin(:foo)
|
31
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
32
24
|
begin_3.foo
|
33
25
|
|
34
26
|
captures_1 = match.captures
|
35
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
36
27
|
captures_1.foo
|
37
28
|
|
38
29
|
end_1 = match.end(0)
|
39
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
40
30
|
end_1.foo
|
41
31
|
|
42
32
|
end_2 = match.end("foo")
|
43
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
44
33
|
end_2.foo
|
45
34
|
|
46
35
|
end_3 = match.end(:foo)
|
47
|
-
# !expects NoMethodError: type=(::Integer | nil), method=foo
|
48
36
|
end_3.foo
|
49
37
|
|
50
38
|
length_1 = match.length
|
51
|
-
# !expects NoMethodError: type=::Integer, method=foo
|
52
39
|
length_1.foo
|
53
40
|
|
54
41
|
named_captures_1 = match.named_captures
|
55
|
-
# !expects NoMethodError: type=::Hash[::String, (::String | nil)], method=foo
|
56
42
|
named_captures_1.foo
|
57
43
|
|
58
44
|
names_1 = match.names
|
59
|
-
# !expects NoMethodError: type=::Array[::String], method=foo
|
60
45
|
names_1.foo
|
61
46
|
|
62
47
|
offset_1 = match.offset(0)
|
63
|
-
# !expects NoMethodError: type=([::Integer, ::Integer] | [nil, nil]), method=foo
|
64
48
|
offset_1.foo
|
65
49
|
|
66
50
|
offset_2 = match.offset("foo")
|
67
|
-
# !expects NoMethodError: type=([::Integer, ::Integer] | [nil, nil]), method=foo
|
68
51
|
offset_2.foo
|
69
52
|
|
70
53
|
offset_3 = match.offset(:foo)
|
71
|
-
# !expects NoMethodError: type=([::Integer, ::Integer] | [nil, nil]), method=foo
|
72
54
|
offset_3.foo
|
73
55
|
|
74
56
|
post_match_1 = match.post_match
|
75
|
-
# !expects NoMethodError: type=::String, method=foo
|
76
57
|
post_match_1.foo
|
77
58
|
|
78
59
|
pre_match_1 = match.pre_match
|
79
|
-
# !expects NoMethodError: type=::String, method=foo
|
80
60
|
pre_match_1.foo
|
81
61
|
|
82
62
|
regexp_1 = match.regexp
|
83
|
-
# !expects NoMethodError: type=::Regexp, method=foo
|
84
63
|
regexp_1.foo
|
85
64
|
|
86
65
|
size_1 = match.size
|
87
|
-
# !expects NoMethodError: type=::Integer, method=foo
|
88
66
|
size_1.foo
|
89
67
|
|
90
68
|
string_1 = match.string
|
91
|
-
# !expects NoMethodError: type=::String, method=foo
|
92
69
|
string_1.foo
|
93
70
|
|
94
71
|
to_a_1 = match.to_a
|
95
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
96
72
|
to_a_1.foo
|
97
73
|
|
98
74
|
values_at_1 = match.values_at
|
99
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
100
75
|
values_at_1.foo
|
101
76
|
|
102
77
|
values_at_2 = match.values_at(0, "foo", :foo)
|
103
|
-
# !expects NoMethodError: type=::Array[(::String | nil)], method=foo
|
104
78
|
values_at_2.foo
|
105
79
|
end
|
@@ -0,0 +1,372 @@
|
|
1
|
+
---
|
2
|
+
test:
|
3
|
+
a.rb:
|
4
|
+
diagnostics:
|
5
|
+
- |
|
6
|
+
a.rb:2:6: [error] Type `::Regexp` does not have method `foo`
|
7
|
+
│ Diagnostic ID: Ruby::NoMethod
|
8
|
+
│
|
9
|
+
└ new_1.foo
|
10
|
+
~~~
|
11
|
+
- |
|
12
|
+
a.rb:5:6: [error] Type `::Regexp` does not have method `foo`
|
13
|
+
│ Diagnostic ID: Ruby::NoMethod
|
14
|
+
│
|
15
|
+
└ new_2.foo
|
16
|
+
~~~
|
17
|
+
- |
|
18
|
+
a.rb:8:6: [error] Type `::Regexp` does not have method `foo`
|
19
|
+
│ Diagnostic ID: Ruby::NoMethod
|
20
|
+
│
|
21
|
+
└ new_3.foo
|
22
|
+
~~~
|
23
|
+
- |
|
24
|
+
a.rb:11:6: [error] Type `::Regexp` does not have method `foo`
|
25
|
+
│ Diagnostic ID: Ruby::NoMethod
|
26
|
+
│
|
27
|
+
└ new_4.foo
|
28
|
+
~~~
|
29
|
+
- |
|
30
|
+
a.rb:14:10: [error] Type `::Regexp` does not have method `foo`
|
31
|
+
│ Diagnostic ID: Ruby::NoMethod
|
32
|
+
│
|
33
|
+
└ compile_1.foo
|
34
|
+
~~~
|
35
|
+
- |
|
36
|
+
a.rb:17:10: [error] Type `::Regexp` does not have method `foo`
|
37
|
+
│ Diagnostic ID: Ruby::NoMethod
|
38
|
+
│
|
39
|
+
└ compile_2.foo
|
40
|
+
~~~
|
41
|
+
- |
|
42
|
+
a.rb:20:10: [error] Type `::Regexp` does not have method `foo`
|
43
|
+
│ Diagnostic ID: Ruby::NoMethod
|
44
|
+
│
|
45
|
+
└ compile_3.foo
|
46
|
+
~~~
|
47
|
+
- |
|
48
|
+
a.rb:23:10: [error] Type `::Regexp` does not have method `foo`
|
49
|
+
│ Diagnostic ID: Ruby::NoMethod
|
50
|
+
│
|
51
|
+
└ compile_4.foo
|
52
|
+
~~~
|
53
|
+
- |
|
54
|
+
a.rb:26:9: [error] Type `::String` does not have method `foo`
|
55
|
+
│ Diagnostic ID: Ruby::NoMethod
|
56
|
+
│
|
57
|
+
└ escape_1.foo
|
58
|
+
~~~
|
59
|
+
- |
|
60
|
+
a.rb:29:13: [error] Type `(::MatchData | nil)` does not have method `foo`
|
61
|
+
│ Diagnostic ID: Ruby::NoMethod
|
62
|
+
│
|
63
|
+
└ last_match_1.foo
|
64
|
+
~~~
|
65
|
+
- |
|
66
|
+
a.rb:32:13: [error] Type `(::String | nil)` does not have method `foo`
|
67
|
+
│ Diagnostic ID: Ruby::NoMethod
|
68
|
+
│
|
69
|
+
└ last_match_2.foo
|
70
|
+
~~~
|
71
|
+
- |
|
72
|
+
a.rb:35:8: [error] Type `::String` does not have method `foo`
|
73
|
+
│ Diagnostic ID: Ruby::NoMethod
|
74
|
+
│
|
75
|
+
└ quote_1.foo
|
76
|
+
~~~
|
77
|
+
- |
|
78
|
+
a.rb:38:14: [error] Type `(::Regexp | nil)` does not have method `foo`
|
79
|
+
│ Diagnostic ID: Ruby::NoMethod
|
80
|
+
│
|
81
|
+
└ try_convert_1.foo
|
82
|
+
~~~
|
83
|
+
- |
|
84
|
+
a.rb:41:8: [error] Type `::Regexp` does not have method `foo`
|
85
|
+
│ Diagnostic ID: Ruby::NoMethod
|
86
|
+
│
|
87
|
+
└ union_1.foo
|
88
|
+
~~~
|
89
|
+
- |
|
90
|
+
a.rb:44:8: [error] Type `::Regexp` does not have method `foo`
|
91
|
+
│ Diagnostic ID: Ruby::NoMethod
|
92
|
+
│
|
93
|
+
└ union_2.foo
|
94
|
+
~~~
|
95
|
+
- |
|
96
|
+
a.rb:47:8: [error] Type `::Regexp` does not have method `foo`
|
97
|
+
│ Diagnostic ID: Ruby::NoMethod
|
98
|
+
│
|
99
|
+
└ union_3.foo
|
100
|
+
~~~
|
101
|
+
- |
|
102
|
+
a.rb:50:8: [error] Type `::Regexp` does not have method `foo`
|
103
|
+
│ Diagnostic ID: Ruby::NoMethod
|
104
|
+
│
|
105
|
+
└ union_4.foo
|
106
|
+
~~~
|
107
|
+
- |
|
108
|
+
a.rb:53:8: [error] Type `::Regexp` does not have method `foo`
|
109
|
+
│ Diagnostic ID: Ruby::NoMethod
|
110
|
+
│
|
111
|
+
└ union_5.foo
|
112
|
+
~~~
|
113
|
+
- |
|
114
|
+
a.rb:56:8: [error] Type `::Regexp` does not have method `foo`
|
115
|
+
│ Diagnostic ID: Ruby::NoMethod
|
116
|
+
│
|
117
|
+
└ union_6.foo
|
118
|
+
~~~
|
119
|
+
- |
|
120
|
+
a.rb:59:8: [error] Type `::Regexp` does not have method `foo`
|
121
|
+
│ Diagnostic ID: Ruby::NoMethod
|
122
|
+
│
|
123
|
+
└ union_7.foo
|
124
|
+
~~~
|
125
|
+
- |
|
126
|
+
a.rb:62:12: [error] Type `bool` does not have method `foo`
|
127
|
+
│ Diagnostic ID: Ruby::NoMethod
|
128
|
+
│
|
129
|
+
└ op_eqeqeq_1.foo
|
130
|
+
~~~
|
131
|
+
- |
|
132
|
+
a.rb:68:11: [error] Type `bool` does not have method `foo`
|
133
|
+
│ Diagnostic ID: Ruby::NoMethod
|
134
|
+
│
|
135
|
+
└ casefold_1.foo
|
136
|
+
~~~
|
137
|
+
- |
|
138
|
+
a.rb:71:11: [error] Type `::Encoding` does not have method `foo`
|
139
|
+
│ Diagnostic ID: Ruby::NoMethod
|
140
|
+
│
|
141
|
+
└ encoding_1.foo
|
142
|
+
~~~
|
143
|
+
- |
|
144
|
+
a.rb:74:17: [error] Type `bool` does not have method `foo`
|
145
|
+
│ Diagnostic ID: Ruby::NoMethod
|
146
|
+
│
|
147
|
+
└ fixed_encoding_1.foo
|
148
|
+
~~~
|
149
|
+
- |
|
150
|
+
a.rb:77:8: [error] Type `(::MatchData | nil)` does not have method `foo`
|
151
|
+
│ Diagnostic ID: Ruby::NoMethod
|
152
|
+
│
|
153
|
+
└ match_1.foo
|
154
|
+
~~~
|
155
|
+
- |
|
156
|
+
a.rb:80:8: [error] Type `(::MatchData | nil)` does not have method `foo`
|
157
|
+
│ Diagnostic ID: Ruby::NoMethod
|
158
|
+
│
|
159
|
+
└ match_2.foo
|
160
|
+
~~~
|
161
|
+
- |
|
162
|
+
a.rb:83:4: [error] Type `::MatchData` does not have method `foo`
|
163
|
+
│ Diagnostic ID: Ruby::NoMethod
|
164
|
+
│
|
165
|
+
└ m.foo
|
166
|
+
~~~
|
167
|
+
- |
|
168
|
+
a.rb:87:4: [error] Type `::MatchData` does not have method `foo`
|
169
|
+
│ Diagnostic ID: Ruby::NoMethod
|
170
|
+
│
|
171
|
+
└ m.foo
|
172
|
+
~~~
|
173
|
+
- |
|
174
|
+
a.rb:91:10: [error] Type `bool` does not have method `foo`
|
175
|
+
│ Diagnostic ID: Ruby::NoMethod
|
176
|
+
│
|
177
|
+
└ match_q_1.foo
|
178
|
+
~~~
|
179
|
+
- |
|
180
|
+
a.rb:94:10: [error] Type `bool` does not have method `foo`
|
181
|
+
│ Diagnostic ID: Ruby::NoMethod
|
182
|
+
│
|
183
|
+
└ match_q_2.foo
|
184
|
+
~~~
|
185
|
+
- |
|
186
|
+
a.rb:97:17: [error] Type `::Hash[::String, ::Array[::Integer]]` does not have method `foo`
|
187
|
+
│ Diagnostic ID: Ruby::NoMethod
|
188
|
+
│
|
189
|
+
└ named_captures_1.foo
|
190
|
+
~~~
|
191
|
+
- |
|
192
|
+
a.rb:100:8: [error] Type `::Array[::String]` does not have method `foo`
|
193
|
+
│ Diagnostic ID: Ruby::NoMethod
|
194
|
+
│
|
195
|
+
└ names_1.foo
|
196
|
+
~~~
|
197
|
+
- |
|
198
|
+
a.rb:103:10: [error] Type `::Integer` does not have method `foo`
|
199
|
+
│ Diagnostic ID: Ruby::NoMethod
|
200
|
+
│
|
201
|
+
└ options_1.foo
|
202
|
+
~~~
|
203
|
+
- |
|
204
|
+
a.rb:106:9: [error] Type `::String` does not have method `foo`
|
205
|
+
│ Diagnostic ID: Ruby::NoMethod
|
206
|
+
│
|
207
|
+
└ source_1.foo
|
208
|
+
~~~
|
209
|
+
- |
|
210
|
+
a.rb:109:17: [error] Type `(::Integer | nil)` does not have method `foo`
|
211
|
+
│ Diagnostic ID: Ruby::NoMethod
|
212
|
+
│
|
213
|
+
└ op_unary_match_1.foo
|
214
|
+
~~~
|
215
|
+
b.rb:
|
216
|
+
diagnostics:
|
217
|
+
- |
|
218
|
+
b.rb:3:14: [error] Type `(::String | nil)` does not have method `foo`
|
219
|
+
│ Diagnostic ID: Ruby::NoMethod
|
220
|
+
│
|
221
|
+
└ match_ref_1.foo
|
222
|
+
~~~
|
223
|
+
- |
|
224
|
+
b.rb:6:14: [error] Type `(::String | nil)` does not have method `foo`
|
225
|
+
│ Diagnostic ID: Ruby::NoMethod
|
226
|
+
│
|
227
|
+
└ match_ref_2.foo
|
228
|
+
~~~
|
229
|
+
- |
|
230
|
+
b.rb:9:14: [error] Type `(::String | nil)` does not have method `foo`
|
231
|
+
│ Diagnostic ID: Ruby::NoMethod
|
232
|
+
│
|
233
|
+
└ match_ref_3.foo
|
234
|
+
~~~
|
235
|
+
- |
|
236
|
+
b.rb:12:14: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
237
|
+
│ Diagnostic ID: Ruby::NoMethod
|
238
|
+
│
|
239
|
+
└ match_ref_4.foo
|
240
|
+
~~~
|
241
|
+
- |
|
242
|
+
b.rb:15:14: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
243
|
+
│ Diagnostic ID: Ruby::NoMethod
|
244
|
+
│
|
245
|
+
└ match_ref_5.foo
|
246
|
+
~~~
|
247
|
+
- |
|
248
|
+
b.rb:18:10: [error] Type `(::Integer | nil)` does not have method `foo`
|
249
|
+
│ Diagnostic ID: Ruby::NoMethod
|
250
|
+
│
|
251
|
+
└ begin_1.foo
|
252
|
+
~~~
|
253
|
+
- |
|
254
|
+
b.rb:21:10: [error] Type `(::Integer | nil)` does not have method `foo`
|
255
|
+
│ Diagnostic ID: Ruby::NoMethod
|
256
|
+
│
|
257
|
+
└ begin_2.foo
|
258
|
+
~~~
|
259
|
+
- |
|
260
|
+
b.rb:24:10: [error] Type `(::Integer | nil)` does not have method `foo`
|
261
|
+
│ Diagnostic ID: Ruby::NoMethod
|
262
|
+
│
|
263
|
+
└ begin_3.foo
|
264
|
+
~~~
|
265
|
+
- |
|
266
|
+
b.rb:27:13: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
267
|
+
│ Diagnostic ID: Ruby::NoMethod
|
268
|
+
│
|
269
|
+
└ captures_1.foo
|
270
|
+
~~~
|
271
|
+
- |
|
272
|
+
b.rb:30:8: [error] Type `(::Integer | nil)` does not have method `foo`
|
273
|
+
│ Diagnostic ID: Ruby::NoMethod
|
274
|
+
│
|
275
|
+
└ end_1.foo
|
276
|
+
~~~
|
277
|
+
- |
|
278
|
+
b.rb:33:8: [error] Type `(::Integer | nil)` does not have method `foo`
|
279
|
+
│ Diagnostic ID: Ruby::NoMethod
|
280
|
+
│
|
281
|
+
└ end_2.foo
|
282
|
+
~~~
|
283
|
+
- |
|
284
|
+
b.rb:36:8: [error] Type `(::Integer | nil)` does not have method `foo`
|
285
|
+
│ Diagnostic ID: Ruby::NoMethod
|
286
|
+
│
|
287
|
+
└ end_3.foo
|
288
|
+
~~~
|
289
|
+
- |
|
290
|
+
b.rb:39:11: [error] Type `::Integer` does not have method `foo`
|
291
|
+
│ Diagnostic ID: Ruby::NoMethod
|
292
|
+
│
|
293
|
+
└ length_1.foo
|
294
|
+
~~~
|
295
|
+
- |
|
296
|
+
b.rb:42:19: [error] Type `::Hash[::String, (::String | nil)]` does not have method `foo`
|
297
|
+
│ Diagnostic ID: Ruby::NoMethod
|
298
|
+
│
|
299
|
+
└ named_captures_1.foo
|
300
|
+
~~~
|
301
|
+
- |
|
302
|
+
b.rb:45:10: [error] Type `::Array[::String]` does not have method `foo`
|
303
|
+
│ Diagnostic ID: Ruby::NoMethod
|
304
|
+
│
|
305
|
+
└ names_1.foo
|
306
|
+
~~~
|
307
|
+
- |
|
308
|
+
b.rb:48:11: [error] Type `([::Integer, ::Integer] | [nil, nil])` does not have method `foo`
|
309
|
+
│ Diagnostic ID: Ruby::NoMethod
|
310
|
+
│
|
311
|
+
└ offset_1.foo
|
312
|
+
~~~
|
313
|
+
- |
|
314
|
+
b.rb:51:11: [error] Type `([::Integer, ::Integer] | [nil, nil])` does not have method `foo`
|
315
|
+
│ Diagnostic ID: Ruby::NoMethod
|
316
|
+
│
|
317
|
+
└ offset_2.foo
|
318
|
+
~~~
|
319
|
+
- |
|
320
|
+
b.rb:54:11: [error] Type `([::Integer, ::Integer] | [nil, nil])` does not have method `foo`
|
321
|
+
│ Diagnostic ID: Ruby::NoMethod
|
322
|
+
│
|
323
|
+
└ offset_3.foo
|
324
|
+
~~~
|
325
|
+
- |
|
326
|
+
b.rb:57:15: [error] Type `::String` does not have method `foo`
|
327
|
+
│ Diagnostic ID: Ruby::NoMethod
|
328
|
+
│
|
329
|
+
└ post_match_1.foo
|
330
|
+
~~~
|
331
|
+
- |
|
332
|
+
b.rb:60:14: [error] Type `::String` does not have method `foo`
|
333
|
+
│ Diagnostic ID: Ruby::NoMethod
|
334
|
+
│
|
335
|
+
└ pre_match_1.foo
|
336
|
+
~~~
|
337
|
+
- |
|
338
|
+
b.rb:63:11: [error] Type `::Regexp` does not have method `foo`
|
339
|
+
│ Diagnostic ID: Ruby::NoMethod
|
340
|
+
│
|
341
|
+
└ regexp_1.foo
|
342
|
+
~~~
|
343
|
+
- |
|
344
|
+
b.rb:66:9: [error] Type `::Integer` does not have method `foo`
|
345
|
+
│ Diagnostic ID: Ruby::NoMethod
|
346
|
+
│
|
347
|
+
└ size_1.foo
|
348
|
+
~~~
|
349
|
+
- |
|
350
|
+
b.rb:69:11: [error] Type `::String` does not have method `foo`
|
351
|
+
│ Diagnostic ID: Ruby::NoMethod
|
352
|
+
│
|
353
|
+
└ string_1.foo
|
354
|
+
~~~
|
355
|
+
- |
|
356
|
+
b.rb:72:9: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
357
|
+
│ Diagnostic ID: Ruby::NoMethod
|
358
|
+
│
|
359
|
+
└ to_a_1.foo
|
360
|
+
~~~
|
361
|
+
- |
|
362
|
+
b.rb:75:14: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
363
|
+
│ Diagnostic ID: Ruby::NoMethod
|
364
|
+
│
|
365
|
+
└ values_at_1.foo
|
366
|
+
~~~
|
367
|
+
- |
|
368
|
+
b.rb:78:14: [error] Type `::Array[(::String | nil)]` does not have method `foo`
|
369
|
+
│ Diagnostic ID: Ruby::NoMethod
|
370
|
+
│
|
371
|
+
└ values_at_2.foo
|
372
|
+
~~~
|