steep 1.6.0 → 1.7.0.dev.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/.github/dependabot.yml +6 -0
- data/.github/workflows/ruby-windows.yml +2 -1
- data/.github/workflows/ruby.yml +9 -10
- data/.gitignore +0 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +30 -28
- data/Rakefile +5 -0
- data/bin/output_test.rb +1 -0
- data/doc/narrowing.md +195 -0
- data/gemfile_steep/Gemfile +1 -1
- data/gemfile_steep/Gemfile.lock +31 -16
- data/guides/src/getting-started/getting-started.md +10 -11
- data/lib/steep/ast/ignore.rb +148 -0
- data/lib/steep/cli.rb +6 -1
- data/lib/steep/diagnostic/ruby.rb +16 -0
- data/lib/steep/drivers/utils/driver_helper.rb +22 -11
- data/lib/steep/node_helper.rb +12 -0
- data/lib/steep/project/dsl.rb +18 -21
- data/lib/steep/project/options.rb +39 -2
- data/lib/steep/project.rb +11 -7
- data/lib/steep/server/change_buffer.rb +2 -2
- data/lib/steep/server/interaction_worker.rb +61 -11
- data/lib/steep/server/worker_process.rb +3 -1
- data/lib/steep/services/completion_provider.rb +39 -8
- data/lib/steep/services/file_loader.rb +3 -2
- data/lib/steep/services/signature_help_provider.rb +20 -17
- data/lib/steep/services/type_check_service.rb +36 -8
- data/lib/steep/source/ignore_ranges.rb +69 -0
- data/lib/steep/source.rb +10 -4
- data/lib/steep/subtyping/check.rb +6 -0
- data/lib/steep/subtyping/result.rb +6 -0
- data/lib/steep/type_construction.rb +6 -151
- data/lib/steep/type_inference/case_when.rb +301 -0
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +14 -1
- data/rbs_collection.steep.lock.yaml +8 -6
- data/sig/shims/parser.rbs +10 -0
- data/sig/shims/yaml.rbs +4 -0
- data/sig/steep/ast/ignore.rbs +66 -0
- data/sig/steep/diagnostic/ruby.rbs +8 -0
- data/sig/steep/node_helper.rbs +2 -0
- data/sig/steep/project/dsl.rbs +8 -4
- data/sig/steep/project/options.rbs +21 -1
- data/sig/steep/project.rbs +3 -3
- data/sig/steep/server/change_buffer.rbs +6 -4
- data/sig/steep/server/interaction_worker.rbs +10 -0
- data/sig/steep/server/worker_process.rbs +4 -4
- data/sig/steep/services/completion_provider.rbs +14 -1
- data/sig/steep/services/type_check_service.rbs +6 -1
- data/sig/steep/source/ignore_ranges.rbs +38 -0
- data/sig/steep/source.rbs +5 -2
- data/sig/steep/subtyping/check.rbs +4 -2
- data/sig/steep/subtyping/result.rbs +5 -1
- data/sig/steep/type_construction.rbs +1 -26
- data/sig/steep/type_inference/case_when.rbs +130 -0
- data/sig/steep.rbs +9 -0
- data/steep.gemspec +1 -1
- metadata +11 -258
- data/smoke/alias/Steepfile +0 -6
- data/smoke/alias/a.rb +0 -16
- data/smoke/alias/a.rbs +0 -10
- data/smoke/alias/b.rb +0 -6
- data/smoke/alias/c.rb +0 -8
- data/smoke/alias/test_expectations.yml +0 -96
- data/smoke/and/Steepfile +0 -6
- data/smoke/and/a.rb +0 -8
- data/smoke/and/test_expectations.yml +0 -29
- data/smoke/array/Steepfile +0 -6
- data/smoke/array/a.rb +0 -18
- data/smoke/array/b.rb +0 -12
- data/smoke/array/c.rb +0 -6
- data/smoke/array/test_expectations.yml +0 -103
- data/smoke/block/Steepfile +0 -6
- data/smoke/block/a.rb +0 -10
- data/smoke/block/a.rbs +0 -6
- data/smoke/block/b.rb +0 -13
- data/smoke/block/c.rb +0 -9
- data/smoke/block/c.rbs +0 -3
- data/smoke/block/d.rb +0 -11
- data/smoke/block/e.rb +0 -12
- data/smoke/block/e.rbs +0 -4
- data/smoke/block/test_expectations.yml +0 -133
- data/smoke/case/Steepfile +0 -6
- data/smoke/case/a.rb +0 -18
- data/smoke/case/test_expectations.yml +0 -47
- data/smoke/class/Steepfile +0 -6
- data/smoke/class/a.rb +0 -25
- data/smoke/class/a.rbs +0 -23
- data/smoke/class/b.rb +0 -5
- data/smoke/class/c.rb +0 -9
- data/smoke/class/f.rb +0 -10
- data/smoke/class/g.rb +0 -6
- data/smoke/class/h.rb +0 -19
- data/smoke/class/h.rbs +0 -6
- data/smoke/class/i.rb +0 -14
- data/smoke/class/i.rbs +0 -9
- data/smoke/class/test_expectations.yml +0 -117
- data/smoke/compact/Steepfile +0 -6
- data/smoke/compact/a.rb +0 -2
- data/smoke/compact/a.rbs +0 -5
- data/smoke/compact/b.rb +0 -2
- data/smoke/compact/test_expectations.yml +0 -18
- data/smoke/const/Steepfile +0 -6
- data/smoke/const/a.rb +0 -27
- data/smoke/const/b.rb +0 -7
- data/smoke/const/b.rbs +0 -5
- data/smoke/const/test_expectations.yml +0 -134
- data/smoke/diagnostics/Steepfile +0 -6
- data/smoke/diagnostics/a.rbs +0 -22
- data/smoke/diagnostics/argument_type_mismatch.rb +0 -1
- data/smoke/diagnostics/block_body_type_mismatch.rb +0 -1
- data/smoke/diagnostics/block_type_mismatch.rb +0 -3
- data/smoke/diagnostics/break_type_mismatch.rb +0 -1
- data/smoke/diagnostics/different_method_parameter_kind.rb +0 -9
- data/smoke/diagnostics/else_on_exhaustive_case.rb +0 -12
- data/smoke/diagnostics/incompatible_annotation.rb +0 -6
- data/smoke/diagnostics/incompatible_argument.rb +0 -1
- data/smoke/diagnostics/incompatible_assignment.rb +0 -8
- data/smoke/diagnostics/method_arity_mismatch.rb +0 -11
- data/smoke/diagnostics/method_body_type_mismatch.rb +0 -6
- data/smoke/diagnostics/method_definition_missing.rb +0 -2
- data/smoke/diagnostics/method_parameter_mismatch.rb +0 -10
- data/smoke/diagnostics/method_return_type_annotation_mismatch.rb +0 -7
- data/smoke/diagnostics/missing_keyword.rb +0 -1
- data/smoke/diagnostics/no_method.rb +0 -1
- data/smoke/diagnostics/proc_type_expected.rb +0 -3
- data/smoke/diagnostics/required_block_missing.rb +0 -1
- data/smoke/diagnostics/return_type_mismatch.rb +0 -6
- data/smoke/diagnostics/test_expectations.yml +0 -591
- data/smoke/diagnostics/unexpected_block_given.rb +0 -1
- data/smoke/diagnostics/unexpected_dynamic_method.rb +0 -3
- data/smoke/diagnostics/unexpected_jump.rb +0 -4
- data/smoke/diagnostics/unexpected_jump_value.rb +0 -3
- data/smoke/diagnostics/unexpected_keyword.rb +0 -1
- data/smoke/diagnostics/unexpected_splat.rb +0 -1
- data/smoke/diagnostics/unexpected_yield.rb +0 -6
- data/smoke/diagnostics/unknown_constant_assigned.rb +0 -7
- data/smoke/diagnostics/unresolved_overloading.rb +0 -1
- data/smoke/diagnostics/unsupported_syntax.rb +0 -2
- data/smoke/diagnostics-rbs/Steepfile +0 -8
- data/smoke/diagnostics-rbs/duplicated-method-definition.rbs +0 -20
- data/smoke/diagnostics-rbs/generic-parameter-mismatch.rbs +0 -7
- data/smoke/diagnostics-rbs/inherit-module.rbs +0 -2
- data/smoke/diagnostics-rbs/invalid-method-overload.rbs +0 -3
- data/smoke/diagnostics-rbs/invalid-type-application.rbs +0 -7
- data/smoke/diagnostics-rbs/invalid_variance_annotation.rbs +0 -3
- data/smoke/diagnostics-rbs/mixin-class-error.rbs +0 -6
- data/smoke/diagnostics-rbs/nonregular-type-alias.rbs +0 -3
- data/smoke/diagnostics-rbs/recursive-alias.rbs +0 -5
- data/smoke/diagnostics-rbs/recursive-class.rbs +0 -8
- data/smoke/diagnostics-rbs/recursive-type-alias.rbs +0 -3
- data/smoke/diagnostics-rbs/superclass-mismatch.rbs +0 -7
- data/smoke/diagnostics-rbs/test_expectations.yml +0 -300
- data/smoke/diagnostics-rbs/unknown-method-alias.rbs +0 -3
- data/smoke/diagnostics-rbs/unknown-type-name-2.rbs +0 -5
- data/smoke/diagnostics-rbs/unknown-type-name.rbs +0 -13
- data/smoke/diagnostics-rbs-duplicated/Steepfile +0 -6
- data/smoke/diagnostics-rbs-duplicated/a.rbs +0 -5
- data/smoke/diagnostics-rbs-duplicated/test_expectations.yml +0 -13
- data/smoke/diagnostics-ruby-unsat/Steepfile +0 -6
- data/smoke/diagnostics-ruby-unsat/a.rbs +0 -3
- data/smoke/diagnostics-ruby-unsat/test_expectations.yml +0 -27
- data/smoke/diagnostics-ruby-unsat/unsatisfiable_constraint.rb +0 -6
- data/smoke/dstr/Steepfile +0 -6
- data/smoke/dstr/a.rb +0 -5
- data/smoke/dstr/test_expectations.yml +0 -13
- data/smoke/ensure/Steepfile +0 -6
- data/smoke/ensure/a.rb +0 -18
- data/smoke/ensure/test_expectations.yml +0 -62
- data/smoke/enumerator/Steepfile +0 -6
- data/smoke/enumerator/a.rb +0 -6
- data/smoke/enumerator/b.rb +0 -17
- data/smoke/enumerator/test_expectations.yml +0 -47
- data/smoke/extension/Steepfile +0 -6
- data/smoke/extension/a.rb +0 -10
- data/smoke/extension/a.rbs +0 -13
- data/smoke/extension/b.rb +0 -10
- data/smoke/extension/c.rb +0 -9
- data/smoke/extension/d.rb +0 -2
- data/smoke/extension/e.rb +0 -2
- data/smoke/extension/e.rbs +0 -7
- data/smoke/extension/f.rb +0 -2
- data/smoke/extension/f.rbs +0 -3
- data/smoke/extension/test_expectations.yml +0 -73
- data/smoke/hash/Steepfile +0 -6
- data/smoke/hash/a.rb +0 -17
- data/smoke/hash/a.rbs +0 -8
- data/smoke/hash/b.rb +0 -6
- data/smoke/hash/c.rb +0 -15
- data/smoke/hash/d.rb +0 -5
- data/smoke/hash/e.rb +0 -1
- data/smoke/hash/e.rbs +0 -3
- data/smoke/hash/f.rb +0 -11
- data/smoke/hash/test_expectations.yml +0 -81
- data/smoke/hello/Steepfile +0 -6
- data/smoke/hello/hello.rb +0 -11
- data/smoke/hello/hello.rbs +0 -7
- data/smoke/hello/test_expectations.yml +0 -25
- data/smoke/if/Steepfile +0 -6
- data/smoke/if/a.rb +0 -20
- data/smoke/if/test_expectations.yml +0 -34
- data/smoke/implements/Steepfile +0 -6
- data/smoke/implements/a.rb +0 -12
- data/smoke/implements/a.rbs +0 -6
- data/smoke/implements/b.rb +0 -13
- data/smoke/implements/b.rbs +0 -12
- data/smoke/implements/test_expectations.yml +0 -23
- data/smoke/initialize/Steepfile +0 -6
- data/smoke/initialize/a.rb +0 -12
- data/smoke/initialize/a.rbs +0 -3
- data/smoke/initialize/test_expectations.yml +0 -1
- data/smoke/integer/Steepfile +0 -6
- data/smoke/integer/a.rb +0 -26
- data/smoke/integer/test_expectations.yml +0 -110
- data/smoke/interface/Steepfile +0 -6
- data/smoke/interface/a.rb +0 -12
- data/smoke/interface/a.rbs +0 -12
- data/smoke/interface/test_expectations.yml +0 -23
- data/smoke/kwbegin/Steepfile +0 -6
- data/smoke/kwbegin/a.rb +0 -7
- data/smoke/kwbegin/test_expectations.yml +0 -17
- data/smoke/lambda/Steepfile +0 -6
- data/smoke/lambda/a.rb +0 -10
- data/smoke/lambda/test_expectations.yml +0 -17
- data/smoke/literal/Steepfile +0 -6
- data/smoke/literal/a.rb +0 -11
- data/smoke/literal/b.rb +0 -7
- data/smoke/literal/literal_methods.rbs +0 -4
- data/smoke/literal/test_expectations.yml +0 -106
- data/smoke/map/Steepfile +0 -6
- data/smoke/map/a.rb +0 -5
- data/smoke/map/test_expectations.yml +0 -1
- data/smoke/method/Steepfile +0 -6
- data/smoke/method/a.rb +0 -21
- data/smoke/method/a.rbs +0 -4
- data/smoke/method/b.rb +0 -25
- data/smoke/method/c.rb +0 -5
- data/smoke/method/d.rb +0 -1
- data/smoke/method/d.rbs +0 -3
- data/smoke/method/test_expectations.yml +0 -121
- data/smoke/module/Steepfile +0 -6
- data/smoke/module/a.rb +0 -19
- data/smoke/module/a.rbs +0 -16
- data/smoke/module/b.rb +0 -6
- data/smoke/module/c.rb +0 -22
- data/smoke/module/d.rb +0 -4
- data/smoke/module/e.rb +0 -13
- data/smoke/module/f.rb +0 -11
- data/smoke/module/test_expectations.yml +0 -75
- data/smoke/regexp/Steepfile +0 -6
- data/smoke/regexp/a.rb +0 -109
- data/smoke/regexp/b.rb +0 -79
- data/smoke/regexp/test_expectations.yml +0 -615
- data/smoke/regression/Steepfile +0 -6
- data/smoke/regression/array.rb +0 -7
- data/smoke/regression/block_param_split.rb +0 -7
- data/smoke/regression/block_param_split.rbs +0 -3
- data/smoke/regression/empty_yield.rb +0 -5
- data/smoke/regression/empty_yield.rbs +0 -3
- data/smoke/regression/enumerator_product.rb +0 -1
- data/smoke/regression/fun.rb +0 -8
- data/smoke/regression/fun.rbs +0 -4
- data/smoke/regression/hash.rb +0 -7
- data/smoke/regression/hello world.rb +0 -1
- data/smoke/regression/issue_328.rb +0 -1
- data/smoke/regression/issue_328.rbs +0 -0
- data/smoke/regression/issue_332.rb +0 -11
- data/smoke/regression/issue_332.rbs +0 -19
- data/smoke/regression/issue_372.rb +0 -8
- data/smoke/regression/issue_372.rbs +0 -4
- data/smoke/regression/lambda.rb +0 -3
- data/smoke/regression/masgn.rb +0 -4
- data/smoke/regression/poly_new.rb +0 -2
- data/smoke/regression/poly_new.rbs +0 -4
- data/smoke/regression/range.rb +0 -5
- data/smoke/regression/set_divide.rb +0 -12
- data/smoke/regression/test_expectations.yml +0 -120
- data/smoke/regression/thread.rb +0 -7
- data/smoke/rescue/Steepfile +0 -6
- data/smoke/rescue/a.rb +0 -48
- data/smoke/rescue/test_expectations.yml +0 -79
- data/smoke/self/Steepfile +0 -6
- data/smoke/self/a.rb +0 -21
- data/smoke/self/a.rbs +0 -4
- data/smoke/self/test_expectations.yml +0 -23
- data/smoke/skip/Steepfile +0 -6
- data/smoke/skip/skip.rb +0 -13
- data/smoke/skip/test_expectations.yml +0 -23
- data/smoke/stdout/Steepfile +0 -6
- data/smoke/stdout/a.rb +0 -8
- data/smoke/stdout/a.rbs +0 -7
- data/smoke/stdout/test_expectations.yml +0 -1
- data/smoke/super/Steepfile +0 -6
- data/smoke/super/a.rb +0 -30
- data/smoke/super/a.rbs +0 -10
- data/smoke/super/test_expectations.yml +0 -69
- data/smoke/toplevel/Steepfile +0 -6
- data/smoke/toplevel/a.rb +0 -3
- data/smoke/toplevel/a.rbs +0 -3
- data/smoke/toplevel/test_expectations.yml +0 -15
- data/smoke/tsort/Steepfile +0 -7
- data/smoke/tsort/a.rb +0 -12
- data/smoke/tsort/test_expectations.yml +0 -1
- data/smoke/type_case/Steepfile +0 -6
- data/smoke/type_case/a.rb +0 -24
- data/smoke/type_case/test_expectations.yml +0 -58
- data/smoke/unexpected/Steepfile +0 -6
- data/smoke/unexpected/test_expectations.yml +0 -13
- data/smoke/unexpected/unexpected.rbs +0 -3
- data/smoke/yield/Steepfile +0 -6
- data/smoke/yield/a.rb +0 -15
- data/smoke/yield/b.rb +0 -6
- data/smoke/yield/test_expectations.yml +0 -88
|
@@ -178,6 +178,18 @@ module Steep
|
|
|
178
178
|
def comments: () -> Array[RBS::AST::Comment]
|
|
179
179
|
end
|
|
180
180
|
|
|
181
|
+
class TextItem
|
|
182
|
+
attr_reader label: String
|
|
183
|
+
|
|
184
|
+
attr_reader text: String
|
|
185
|
+
|
|
186
|
+
attr_reader help_text: String?
|
|
187
|
+
|
|
188
|
+
attr_reader range: Range
|
|
189
|
+
|
|
190
|
+
def initialize: (text: String, help_text: String?, range: Range, label: String) -> void
|
|
191
|
+
end
|
|
192
|
+
|
|
181
193
|
type item = InstanceVariableItem
|
|
182
194
|
| KeywordArgumentItem
|
|
183
195
|
| LocalVariableItem
|
|
@@ -186,6 +198,7 @@ module Steep
|
|
|
186
198
|
| ComplexMethodNameItem
|
|
187
199
|
| GeneratedMethodNameItem
|
|
188
200
|
| TypeNameItem
|
|
201
|
+
| TextItem
|
|
189
202
|
|
|
190
203
|
attr_reader source_text: String
|
|
191
204
|
|
|
@@ -209,7 +222,7 @@ module Steep
|
|
|
209
222
|
|
|
210
223
|
def range_from_loc: (Parser::Source::Range loc) -> Range
|
|
211
224
|
|
|
212
|
-
def at_comment?: (Position pos) ->
|
|
225
|
+
def at_comment?: (Position pos) -> Parser::Source::Comment?
|
|
213
226
|
|
|
214
227
|
def at_end?: (Position pos, of: Parser::Source::Map | Parser::Source::Range | nil) -> boolish
|
|
215
228
|
|
|
@@ -20,6 +20,8 @@ module Steep
|
|
|
20
20
|
|
|
21
21
|
attr_reader typing: Typing?
|
|
22
22
|
|
|
23
|
+
attr_reader ignores: Source::IgnoreRanges?
|
|
24
|
+
|
|
23
25
|
attr_reader errors: Array[Diagnostic::Ruby::Base]?
|
|
24
26
|
|
|
25
27
|
def initialize: (
|
|
@@ -27,17 +29,20 @@ module Steep
|
|
|
27
29
|
node: Parser::AST::Node | nil | false,
|
|
28
30
|
content: String,
|
|
29
31
|
typing: Typing?,
|
|
32
|
+
ignores: Source::IgnoreRanges?,
|
|
30
33
|
errors: Array[Diagnostic::Ruby::Base]?
|
|
31
34
|
) -> void
|
|
32
35
|
|
|
33
36
|
def self.with_syntax_error: (path: Pathname, content: String, error: Diagnostic::Ruby::SyntaxError) -> SourceFile
|
|
34
37
|
|
|
35
|
-
def self.with_typing: (path: Pathname, content: String, typing: Typing, node: Parser::AST::Node?) -> SourceFile
|
|
38
|
+
def self.with_typing: (path: Pathname, content: String, typing: Typing, ignores: Source::IgnoreRanges, node: Parser::AST::Node?) -> SourceFile
|
|
36
39
|
|
|
37
40
|
def self.no_data: (path: Pathname, content: String) -> SourceFile
|
|
38
41
|
|
|
39
42
|
def update_content: (String content) -> SourceFile
|
|
40
43
|
|
|
44
|
+
# Diagnostics filgered by `ignores`
|
|
45
|
+
#
|
|
41
46
|
def diagnostics: () -> Array[Diagnostic::Ruby::Base]
|
|
42
47
|
end
|
|
43
48
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
use Steep::AST::Ignore, RBS::Location
|
|
2
|
+
|
|
3
|
+
module Steep
|
|
4
|
+
class Source
|
|
5
|
+
class IgnoreRanges
|
|
6
|
+
attr_reader all_ignores: Array[Ignore::t]
|
|
7
|
+
|
|
8
|
+
attr_reader error_ignores: Array[Ignore::t]
|
|
9
|
+
|
|
10
|
+
attr_reader ignored_ranges: Array[Range[Integer]]
|
|
11
|
+
|
|
12
|
+
attr_reader ignored_lines: Hash[Integer, Ignore::IgnoreLine]
|
|
13
|
+
|
|
14
|
+
def initialize: (ignores: Array[Ignore::t]) -> void
|
|
15
|
+
|
|
16
|
+
# If given diagnostic code at the location is ignored or not
|
|
17
|
+
#
|
|
18
|
+
# Ignore ranges work for location that is completely inside the range.
|
|
19
|
+
# Both the starting point and ending point should be in one range.
|
|
20
|
+
# Only diagnostic (1) is ignored in the following example.
|
|
21
|
+
#
|
|
22
|
+
# ```ruby
|
|
23
|
+
# + <2
|
|
24
|
+
# # steep:ignore:start |
|
|
25
|
+
# 1> + +
|
|
26
|
+
# + +
|
|
27
|
+
# # steep:ignore:end |
|
|
28
|
+
# + <3
|
|
29
|
+
# ```
|
|
30
|
+
#
|
|
31
|
+
# Ignore lines work for location that has starting line or ending line.
|
|
32
|
+
#
|
|
33
|
+
def ignore?: (Integer start_line, Integer end_line, String code) -> bool
|
|
34
|
+
|
|
35
|
+
def ignore_code?: (Ignore::IgnoreLine, String code) -> bool
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/sig/steep/source.rbs
CHANGED
|
@@ -12,19 +12,22 @@ module Steep
|
|
|
12
12
|
|
|
13
13
|
attr_reader comments: Array[Parser::Source::Comment]
|
|
14
14
|
|
|
15
|
+
attr_reader ignores: Array[AST::Ignore::t]
|
|
16
|
+
|
|
15
17
|
def initialize: (
|
|
16
18
|
buffer: RBS::Buffer,
|
|
17
19
|
path: Pathname,
|
|
18
20
|
node: Parser::AST::Node?,
|
|
19
21
|
mapping: Hash[Parser::AST::Node, Array[AST::Annotation::t]],
|
|
20
|
-
comments: Array[Parser::Source::Comment]
|
|
22
|
+
comments: Array[Parser::Source::Comment],
|
|
23
|
+
ignores: Array[AST::Ignore::t]
|
|
21
24
|
) -> void
|
|
22
25
|
|
|
23
26
|
class Builder < ::Parser::Builders::Default
|
|
24
27
|
def string_value: (untyped token) -> untyped
|
|
25
28
|
end
|
|
26
29
|
|
|
27
|
-
def self.new_parser: () -> Parser::
|
|
30
|
+
def self.new_parser: () -> Parser::Ruby33
|
|
28
31
|
|
|
29
32
|
def self.parse: (String source_code, path: Pathname, factory: AST::Types::Factory) -> Source
|
|
30
33
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module Steep
|
|
2
2
|
module Subtyping
|
|
3
3
|
class Check
|
|
4
|
+
ABORT_LIMIT: Integer
|
|
5
|
+
|
|
4
6
|
attr_reader builder: Interface::Builder
|
|
5
7
|
|
|
6
8
|
attr_reader cache: Cache
|
|
@@ -21,7 +23,7 @@ module Steep
|
|
|
21
23
|
|
|
22
24
|
def factory: () -> AST::Types::Factory
|
|
23
25
|
|
|
24
|
-
def with_context: [A] (self_type: AST::Types::t
|
|
26
|
+
def with_context: [A] (self_type: AST::Types::t?, instance_type: AST::Types::t?, class_type: AST::Types::t?, constraints: Constraints?) { () -> A } -> A
|
|
25
27
|
|
|
26
28
|
def self_type: () -> AST::Types::t
|
|
27
29
|
|
|
@@ -50,7 +52,7 @@ module Steep
|
|
|
50
52
|
|
|
51
53
|
def singleton_super_types: (RBS::TypeName type_name) -> Array[super_type]
|
|
52
54
|
|
|
53
|
-
def check: (Relation[AST::Types::t] relation, constraints: Constraints, self_type: AST::Types::t
|
|
55
|
+
def check: (Relation[AST::Types::t] relation, constraints: Constraints, self_type: AST::Types::t?, instance_type: AST::Types::t?, class_type: AST::Types::t?) -> Result::t
|
|
54
56
|
|
|
55
57
|
def check_type: (Relation[AST::Types::t] relation) -> Result::t
|
|
56
58
|
|
|
@@ -81,7 +81,7 @@ module Steep
|
|
|
81
81
|
class Failure < Base
|
|
82
82
|
type error = MethodMissingError | BlockMismatchError | ParameterMismatchError
|
|
83
83
|
| UnknownPairError | PolyMethodSubtyping | UnsatisfiedConstraints
|
|
84
|
-
| SelfBindingMismatch
|
|
84
|
+
| SelfBindingMismatch | LoopAbort
|
|
85
85
|
|
|
86
86
|
class MethodMissingError
|
|
87
87
|
attr_reader name: untyped
|
|
@@ -145,6 +145,10 @@ module Steep
|
|
|
145
145
|
def message: () -> String
|
|
146
146
|
end
|
|
147
147
|
|
|
148
|
+
class LoopAbort
|
|
149
|
+
def message: () -> String
|
|
150
|
+
end
|
|
151
|
+
|
|
148
152
|
attr_reader error: error
|
|
149
153
|
|
|
150
154
|
def initialize: (Relation[untyped] relation, error error) -> void
|
|
@@ -400,7 +400,7 @@ module Steep
|
|
|
400
400
|
#
|
|
401
401
|
def namespace_module?: (Parser::AST::Node node) -> bool
|
|
402
402
|
|
|
403
|
-
def type_any_rec: (Parser::AST::Node node) -> Pair
|
|
403
|
+
def type_any_rec: (Parser::AST::Node node, ?only_children: bool) -> Pair
|
|
404
404
|
|
|
405
405
|
def unwrap: (AST::Types::t `type`) -> AST::Types::t
|
|
406
406
|
|
|
@@ -533,35 +533,10 @@ module Steep
|
|
|
533
533
|
#
|
|
534
534
|
def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node? receiver, Array[Parser::AST::Node] arguments) -> bool
|
|
535
535
|
|
|
536
|
-
# Transform given `node` to a node that has a local variable instead of the outer most call/non-value node
|
|
537
|
-
#
|
|
538
|
-
# Returns a pair of transformed node and the outer most call/non-value node if present.
|
|
539
|
-
#
|
|
540
|
-
# ```rb
|
|
541
|
-
# x = y = foo() # Call `#transform_condition_node` with the node and var_name `:__foo__`
|
|
542
|
-
# # => Returns [x = y = __foo__, foo()]
|
|
543
|
-
#
|
|
544
|
-
# x # Call `#transform_condition_node` with the node and var_name `:__foo__`
|
|
545
|
-
# # => Returns [__foo__, x]
|
|
546
|
-
# ```
|
|
547
|
-
#
|
|
548
|
-
# This is typically used for transforming assginment node for case condition.
|
|
549
|
-
#
|
|
550
|
-
def transform_condition_node: (Parser::AST::Node node, Symbol) -> [Parser::AST::Node, Parser::AST::Node]
|
|
551
|
-
|
|
552
536
|
def type_name: (AST::Types::t) -> RBS::TypeName?
|
|
553
537
|
|
|
554
538
|
def singleton_type: (AST::Types::t) -> AST::Types::t?
|
|
555
539
|
|
|
556
540
|
def instance_type: (AST::Types::t) -> AST::Types::t?
|
|
557
|
-
|
|
558
|
-
# Propagate an entry of `source` in TypeEnv to `dest`
|
|
559
|
-
#
|
|
560
|
-
# `source` is name of a local variable.
|
|
561
|
-
#
|
|
562
|
-
# If `dest` is a `lvar` node, it updates local variable entry of TypeEnv.
|
|
563
|
-
# Otherwise, it updates *pure* call of `dest` if it already exists.
|
|
564
|
-
#
|
|
565
|
-
def propagate_type_env: (Symbol source, Parser::AST::Node dest, TypeInference::TypeEnv) -> TypeInference::TypeEnv
|
|
566
541
|
end
|
|
567
542
|
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
use Parser::AST::Node
|
|
2
|
+
use Steep::TypeConstruction::Pair, Steep::TypeInference::LogicTypeInterpreter::Result
|
|
3
|
+
use Steep::NodeHelper::condition_loc, Steep::NodeHelper::keyword_loc
|
|
4
|
+
|
|
5
|
+
module Steep
|
|
6
|
+
module TypeInference
|
|
7
|
+
class CaseWhen
|
|
8
|
+
class WhenPatterns
|
|
9
|
+
include NodeHelper
|
|
10
|
+
|
|
11
|
+
attr_reader logic: LogicTypeInterpreter
|
|
12
|
+
|
|
13
|
+
attr_reader initial_constr: TypeConstruction
|
|
14
|
+
|
|
15
|
+
# True if the `when` clause is unreachable
|
|
16
|
+
attr_reader unreachable_clause: bool
|
|
17
|
+
|
|
18
|
+
@assignment_node: Node
|
|
19
|
+
|
|
20
|
+
attr_reader pattern_results: Array[[Node, Result, Result]]
|
|
21
|
+
|
|
22
|
+
def initialize: (LogicTypeInterpreter logic, TypeConstruction initial_constr, bool unreachable, Node assignment_node) -> void
|
|
23
|
+
|
|
24
|
+
def add_pattern: (Node pattern) { (Node, TypeConstruction, bool) -> Pair } -> void
|
|
25
|
+
|
|
26
|
+
# The result for body of the when-clause
|
|
27
|
+
#
|
|
28
|
+
# Raises an error when no patern is registered.
|
|
29
|
+
#
|
|
30
|
+
def body_result: () { (TypeEnv) -> TypeEnv? } -> [TypeConstruction, bool]
|
|
31
|
+
|
|
32
|
+
# The result for next when-clause
|
|
33
|
+
#
|
|
34
|
+
# Raises an error when no patern is registered.
|
|
35
|
+
#
|
|
36
|
+
def falsy_result: () -> [TypeConstruction, bool]
|
|
37
|
+
|
|
38
|
+
# The result for incoming pattern
|
|
39
|
+
def latest_result: () -> [TypeConstruction, bool]
|
|
40
|
+
|
|
41
|
+
# Returns new object equivalent to @assignment_node
|
|
42
|
+
def assignment_node: () -> Node
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
type when_result = [
|
|
46
|
+
Result, # Type of the body of the when-clause
|
|
47
|
+
Result # Result for the case the when-clause doesn't match
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
include NodeHelper
|
|
51
|
+
extend NodeHelper
|
|
52
|
+
|
|
53
|
+
# The location of `#node`
|
|
54
|
+
attr_reader location: condition_loc
|
|
55
|
+
|
|
56
|
+
# `case` node
|
|
57
|
+
attr_reader node: Node
|
|
58
|
+
|
|
59
|
+
attr_reader condition_node: Node
|
|
60
|
+
|
|
61
|
+
attr_reader when_nodes: Array[Node]
|
|
62
|
+
|
|
63
|
+
attr_reader else_node: Node?
|
|
64
|
+
|
|
65
|
+
attr_reader logic: LogicTypeInterpreter
|
|
66
|
+
|
|
67
|
+
attr_reader clause_results: Array[when_result]
|
|
68
|
+
|
|
69
|
+
attr_reader else_result: Pair?
|
|
70
|
+
|
|
71
|
+
# Fresh local variable name that contains the value of `#condition_node`
|
|
72
|
+
attr_reader var_name: Symbol
|
|
73
|
+
|
|
74
|
+
# `lvasgn` node that propagates the value of `#condition_node` to local variables
|
|
75
|
+
attr_reader assignment_node: Node
|
|
76
|
+
|
|
77
|
+
# A node that points to the value of `#condition_node`
|
|
78
|
+
#
|
|
79
|
+
# `nil` if it is an local variable.
|
|
80
|
+
#
|
|
81
|
+
attr_reader value_node: Node?
|
|
82
|
+
|
|
83
|
+
# The result of the type checking of `#condition_node`
|
|
84
|
+
#
|
|
85
|
+
attr_reader initial_constr: TypeConstruction
|
|
86
|
+
|
|
87
|
+
# The public API
|
|
88
|
+
#
|
|
89
|
+
# It type checks given `case` node with condition node, and records types and errors of sub nodes.
|
|
90
|
+
#
|
|
91
|
+
def self.type_check: (TypeConstruction, Node, LogicTypeInterpreter, hint: AST::Types::t?, condition: bool) -> [Array[AST::Types::t], Array[TypeEnv]]
|
|
92
|
+
|
|
93
|
+
def initialize: (Node, LogicTypeInterpreter) { (Node) -> Pair } -> void
|
|
94
|
+
|
|
95
|
+
def when_clauses: () { (WhenPatterns, Array[Node], Node?, keyword_loc) -> when_result } -> void
|
|
96
|
+
|
|
97
|
+
def else_clause: () { (Node, TypeConstruction) -> Pair } -> void
|
|
98
|
+
|
|
99
|
+
def result: () -> [Array[AST::Types::t], Array[TypeEnv]]
|
|
100
|
+
|
|
101
|
+
# Assign type of `value_node`
|
|
102
|
+
def propagate_value_node_type: (TypeEnv) -> TypeEnv?
|
|
103
|
+
|
|
104
|
+
# Returns `true` is `else` keyword is given
|
|
105
|
+
#
|
|
106
|
+
# `else_node` may be `nil` because body expression might be omitted.
|
|
107
|
+
#
|
|
108
|
+
# ```ruby
|
|
109
|
+
# case x
|
|
110
|
+
# when 1
|
|
111
|
+
# else
|
|
112
|
+
# # The body expression is omitted, but the branch is given.
|
|
113
|
+
# end
|
|
114
|
+
# ```
|
|
115
|
+
#
|
|
116
|
+
def has_else_clause?: () -> Parser::Source::Range?
|
|
117
|
+
|
|
118
|
+
# def typing: () -> Typing
|
|
119
|
+
|
|
120
|
+
# Extract assignments
|
|
121
|
+
#
|
|
122
|
+
# Returns a pair of the node that represents the value and assignment.
|
|
123
|
+
#
|
|
124
|
+
def rewrite_condition_node: (Symbol, Node) ->[Node?, Node]
|
|
125
|
+
|
|
126
|
+
# TypeConstruction for incoming clause
|
|
127
|
+
def latest_result: () -> [TypeConstruction, bool]
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
data/sig/steep.rbs
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
module Steep
|
|
2
2
|
VERSION: String
|
|
3
3
|
|
|
4
|
+
# `ui_logger` is a logger for user interaction messages
|
|
5
|
+
#
|
|
6
|
+
# The *main* process has the logger.
|
|
7
|
+
# The *worker* processes disables the logging through this.
|
|
8
|
+
#
|
|
9
|
+
def self.ui_logger: () -> (Logger & ActiveSupport::TaggedLogging)
|
|
10
|
+
|
|
4
11
|
def self.logger: () -> (Logger & ActiveSupport::TaggedLogging)
|
|
5
12
|
|
|
6
13
|
def self.new_logger: (IO output, Integer? prev_level) -> (Logger & ActiveSupport::TaggedLogging)
|
|
@@ -13,6 +20,8 @@ module Steep
|
|
|
13
20
|
|
|
14
21
|
self.@logger: (Logger & ActiveSupport::TaggedLogging)?
|
|
15
22
|
|
|
23
|
+
self.@ui_logger: (Logger & ActiveSupport::TaggedLogging)?
|
|
24
|
+
|
|
16
25
|
class Sampler
|
|
17
26
|
type sample = [String, Float]
|
|
18
27
|
@samples: Array[sample]
|
data/steep.gemspec
CHANGED
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
|
19
19
|
spec.metadata["changelog_uri"] = "https://github.com/soutaro/steep/blob/master/CHANGELOG.md"
|
|
20
20
|
|
|
21
21
|
spec.files = `git ls-files -z`.split("\x0").reject {|f|
|
|
22
|
-
f.match(%r{^(test|spec|features)/})
|
|
22
|
+
f.match(%r{^(test|spec|features|smoke)/})
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
spec.bindir = "exe"
|