steep 1.2.0 → 1.3.0.pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -2
  3. data/Gemfile.lock +14 -4
  4. data/Gemfile.steep +2 -2
  5. data/Gemfile.steep.lock +17 -5
  6. data/Steepfile +7 -9
  7. data/lib/steep/annotation_parser.rb +34 -28
  8. data/lib/steep/ast/annotation.rb +16 -5
  9. data/lib/steep/ast/node/type_application.rb +74 -0
  10. data/lib/steep/ast/node/type_assertion.rb +56 -0
  11. data/lib/steep/ast/types/factory.rb +5 -1
  12. data/lib/steep/diagnostic/helper.rb +2 -1
  13. data/lib/steep/diagnostic/lsp_formatter.rb +3 -1
  14. data/lib/steep/diagnostic/ruby.rb +70 -5
  15. data/lib/steep/diagnostic/signature.rb +21 -8
  16. data/lib/steep/drivers/check.rb +1 -1
  17. data/lib/steep/drivers/checkfile.rb +1 -1
  18. data/lib/steep/drivers/langserver.rb +2 -2
  19. data/lib/steep/drivers/stats.rb +1 -1
  20. data/lib/steep/drivers/watch.rb +1 -1
  21. data/lib/steep/drivers/worker.rb +0 -1
  22. data/lib/steep/server/lsp_formatter.rb +13 -3
  23. data/lib/steep/server/master.rb +4 -1
  24. data/lib/steep/server/worker_process.rb +86 -14
  25. data/lib/steep/services/hover_provider/rbs.rb +7 -7
  26. data/lib/steep/services/hover_provider/ruby.rb +19 -4
  27. data/lib/steep/services/signature_service.rb +7 -4
  28. data/lib/steep/signature/validator.rb +36 -13
  29. data/lib/steep/source.rb +189 -71
  30. data/lib/steep/type_construction.rb +232 -126
  31. data/lib/steep/type_inference/logic_type_interpreter.rb +31 -5
  32. data/lib/steep/version.rb +1 -1
  33. data/lib/steep.rb +2 -0
  34. data/rbs_collection.steep.lock.yaml +52 -11
  35. data/rbs_collection.steep.yaml +1 -1
  36. data/sig/shims/exception.rbs +4 -0
  37. data/sig/shims/parser/comment.rbs +33 -0
  38. data/sig/shims/parser.rbs +30 -2
  39. data/sig/steep/annotation_parser.rbs +59 -0
  40. data/sig/steep/ast/annotation.rbs +21 -26
  41. data/sig/steep/ast/node/type_application.rbs +31 -0
  42. data/sig/steep/ast/node/type_assertion.rbs +26 -0
  43. data/sig/steep/ast/types/factory.rbs +0 -2
  44. data/sig/steep/diagnostic/helper.rbs +9 -3
  45. data/sig/steep/diagnostic/lsp_formatter.rbs +12 -8
  46. data/sig/steep/diagnostic/ruby.rbs +62 -8
  47. data/sig/steep/diagnostic/signature.rbs +118 -85
  48. data/sig/steep/drivers/worker.rbs +11 -13
  49. data/sig/steep/range_extension.rbs +7 -0
  50. data/sig/steep/server/lsp_formatter.rbs +14 -7
  51. data/sig/steep/server/worker_process.rbs +74 -12
  52. data/sig/steep/services/hover_provider/rbs.rbs +27 -7
  53. data/sig/steep/services/hover_provider/ruby.rbs +18 -4
  54. data/sig/steep/services/hover_provider/singleton_methods.rbs +1 -1
  55. data/sig/steep/signature/validator.rbs +76 -0
  56. data/sig/steep/source.rbs +54 -30
  57. data/sig/steep/type_construction.rbs +85 -27
  58. data/sig/steep/type_inference/method_call.rbs +1 -1
  59. data/smoke/diagnostics-rbs/inherit-module.rbs +2 -0
  60. data/smoke/diagnostics-rbs/test_expectations.yml +12 -0
  61. data/steep.gemspec +6 -1
  62. metadata +86 -6
@@ -10,12 +10,20 @@ gems:
10
10
  version: '0'
11
11
  source:
12
12
  type: stdlib
13
+ - name: rbs
14
+ version: 2.8.0.pre.1
15
+ source:
16
+ type: rubygems
17
+ - name: dbm
18
+ version: '0'
19
+ source:
20
+ type: stdlib
13
21
  - name: activesupport
14
22
  version: '6.0'
15
23
  source:
16
24
  type: git
17
25
  name: ruby/gem_rbs_collection
18
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
26
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
19
27
  remote: https://github.com/ruby/gem_rbs_collection.git
20
28
  repo_dir: gems
21
29
  - name: ast
@@ -23,25 +31,41 @@ gems:
23
31
  source:
24
32
  type: git
25
33
  name: ruby/gem_rbs_collection
26
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
34
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
27
35
  remote: https://github.com/ruby/gem_rbs_collection.git
28
36
  repo_dir: gems
37
+ - name: csv
38
+ version: '0'
39
+ source:
40
+ type: stdlib
41
+ - name: fileutils
42
+ version: '0'
43
+ source:
44
+ type: stdlib
29
45
  - name: i18n
30
46
  version: '1.10'
31
47
  source:
32
48
  type: git
33
49
  name: ruby/gem_rbs_collection
34
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
50
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
35
51
  remote: https://github.com/ruby/gem_rbs_collection.git
36
52
  repo_dir: gems
53
+ - name: json
54
+ version: '0'
55
+ source:
56
+ type: stdlib
37
57
  - name: listen
38
58
  version: '3.2'
39
59
  source:
40
60
  type: git
41
61
  name: ruby/gem_rbs_collection
42
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
62
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
43
63
  remote: https://github.com/ruby/gem_rbs_collection.git
44
64
  repo_dir: gems
65
+ - name: logger
66
+ version: '0'
67
+ source:
68
+ type: stdlib
45
69
  - name: minitest
46
70
  version: '0'
47
71
  source:
@@ -51,7 +75,7 @@ gems:
51
75
  source:
52
76
  type: git
53
77
  name: ruby/gem_rbs_collection
54
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
78
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
55
79
  remote: https://github.com/ruby/gem_rbs_collection.git
56
80
  repo_dir: gems
57
81
  - name: rainbow
@@ -59,26 +83,42 @@ gems:
59
83
  source:
60
84
  type: git
61
85
  name: ruby/gem_rbs_collection
62
- revision: dc7059ea0cdf67f486ca9cea2b01d53f04724652
86
+ revision: 94fcc911186b127cffdfd7a378b5e0b511196089
63
87
  remote: https://github.com/ruby/gem_rbs_collection.git
64
88
  repo_dir: gems
65
89
  - name: securerandom
66
90
  version: '0'
67
91
  source:
68
92
  type: stdlib
69
- - name: monitor
93
+ - name: strscan
70
94
  version: '0'
71
95
  source:
72
96
  type: stdlib
73
- - name: date
97
+ - name: pathname
74
98
  version: '0'
75
99
  source:
76
100
  type: stdlib
77
- - name: singleton
101
+ - name: optparse
78
102
  version: '0'
79
103
  source:
80
104
  type: stdlib
81
- - name: logger
105
+ - name: tsort
106
+ version: '0'
107
+ source:
108
+ type: stdlib
109
+ - name: rdoc
110
+ version: '0'
111
+ source:
112
+ type: stdlib
113
+ - name: monitor
114
+ version: '0'
115
+ source:
116
+ type: stdlib
117
+ - name: date
118
+ version: '0'
119
+ source:
120
+ type: stdlib
121
+ - name: singleton
82
122
  version: '0'
83
123
  source:
84
124
  type: stdlib
@@ -90,7 +130,8 @@ gems:
90
130
  version: '0'
91
131
  source:
92
132
  type: stdlib
93
- - name: pathname
133
+ - name: forwardable
94
134
  version: '0'
95
135
  source:
96
136
  type: stdlib
137
+ gemfile_lock_path: Gemfile.steep.lock
@@ -15,6 +15,6 @@ gems:
15
15
  ignore: true
16
16
  - name: set
17
17
  - name: rbs
18
- ignore: true
19
18
  - name: with_steep_types
20
19
  ignore: true
20
+ - name: dbm
@@ -0,0 +1,4 @@
1
+ class Exception
2
+ def initialize: (String?) -> void
3
+ | ...
4
+ end
@@ -0,0 +1,33 @@
1
+ module Parser
2
+ module Source
3
+ class Comment
4
+ def self.associate: (untyped ast, untyped comments) -> untyped
5
+
6
+ def self.associate_by_identity: (untyped ast, untyped comments) -> untyped
7
+
8
+ def self.associate_locations: (untyped ast, untyped comments) -> untyped
9
+
10
+ public
11
+
12
+ def ==: (untyped other) -> bool
13
+
14
+ def document?: () -> bool
15
+
16
+ def inline?: () -> bool
17
+
18
+ def inspect: () -> String
19
+
20
+ alias loc location
21
+
22
+ def location: () -> Map
23
+
24
+ def text: () -> String
25
+
26
+ def type: () -> (:inline | :document)
27
+
28
+ private
29
+
30
+ def initialize: (untyped range) -> void
31
+ end
32
+ end
33
+ end
data/sig/shims/parser.rbs CHANGED
@@ -5,13 +5,41 @@ module Parser
5
5
 
6
6
  attr_reader children: Array[untyped]
7
7
 
8
- def initialize: (Symbol `type`, Array[untyped] children) -> void
8
+ def initialize: (Symbol `type`, ?Array[untyped] children, ?Hash[Symbol, untyped] properties) -> void
9
9
 
10
- def updated: (?Symbol?, ?Array[untyped]?) -> Node
10
+ def updated: (?Symbol?, ?Array[untyped]?, ?Hash[Symbol, untyped]? properties) -> Node
11
11
 
12
12
  attr_reader location: Source::Map
13
13
 
14
14
  alias loc location
15
15
  end
16
16
  end
17
+
18
+ class Ruby31
19
+ def initialize: (untyped builder) -> void
20
+
21
+ def parse: (Source::Buffer) -> AST
22
+
23
+ def parse_with_comments: (Source::Buffer) -> [AST::Node, Array[Source::Comment]]
24
+
25
+ attr_reader diagnostics: untyped
26
+ end
27
+
28
+ module Source
29
+ class Buffer
30
+ def initialize: (String file, Integer lineno, source: String) -> void
31
+ end
32
+ end
33
+
34
+ module Builders
35
+ class Default
36
+ attr_accessor self.emit_lambda: bool
37
+ attr_accessor self.emit_procarg0: bool
38
+ attr_accessor self.emit_kwargs: bool
39
+
40
+ def string_value: (untyped) -> untyped
41
+
42
+ def value: (untyped) -> untyped
43
+ end
44
+ end
17
45
  end
@@ -0,0 +1,59 @@
1
+ module Steep
2
+ class AnnotationParser
3
+ VAR_NAME: Regexp
4
+
5
+ METHOD_NAME: Regexp
6
+
7
+ CONST_NAME: Regexp
8
+
9
+ DYNAMIC_NAME: Regexp
10
+
11
+ IVAR_NAME: Regexp
12
+
13
+ attr_reader factory: AST::Types::Factory
14
+
15
+ def initialize: (factory: AST::Types::Factory) -> void
16
+
17
+ class SyntaxError < StandardError
18
+ attr_reader source: String
19
+
20
+ attr_reader location: RBS::Location[untyped, untyped]
21
+
22
+ def initialize: (source: String, location: RBS::Location[untyped, untyped], ?exn: Exception?) -> void
23
+ end
24
+
25
+ TYPE: Regexp
26
+
27
+ COLON: Regexp
28
+
29
+ PARAM: Regexp
30
+
31
+ TYPE_PARAMS: Regexp
32
+
33
+ def parse_type: (String) -> AST::Types::t
34
+
35
+ # ```
36
+ # @type ${keyword} ${name}: ${type}
37
+ # ```
38
+ #
39
+ # Example:
40
+ #
41
+ # - `@type const Foo::Bar: String`
42
+ # - `@type var xyzzy: Array[String]`
43
+ #
44
+ def keyword_subject_type: (String keyword, Regexp name) -> Regexp
45
+
46
+ # ```
47
+ # @type ${keyword}: ${type}
48
+ # ```
49
+ #
50
+ # Example:
51
+ #
52
+ # - `@type break: String`
53
+ # - `@type self: Foo`
54
+ #
55
+ def keyword_and_type: (String keyword) -> ::Regexp
56
+
57
+ def parse: (String src, location: RBS::Location[untyped, untyped]) -> AST::Annotation::t?
58
+ end
59
+ end
@@ -7,14 +7,20 @@ module Steep
7
7
 
8
8
  type loc = RBS::Location[untyped, untyped]
9
9
 
10
- class Named
11
- attr_reader name: Symbol
10
+ module Located
11
+ attr_reader location: loc?
12
12
 
13
- attr_reader type: Types::t
13
+ %a{pure} def line: () -> Integer?
14
+ end
14
15
 
15
- attr_reader location: loc?
16
+ class Named[T, N]
17
+ attr_reader name: N
18
+
19
+ attr_reader type: T
16
20
 
17
- def initialize: (name: Symbol, type: Types::t, ?location: loc?) -> void
21
+ include Located
22
+
23
+ def initialize: (name: N, type: T, ?location: loc?) -> void
18
24
 
19
25
  def ==: (untyped other) -> bool
20
26
  end
@@ -22,13 +28,11 @@ module Steep
22
28
  class Typed
23
29
  attr_reader type: Types::t
24
30
 
25
- attr_reader annotation: untyped
26
-
27
- attr_reader location: loc?
28
-
29
31
  def initialize: (type: Types::t, ?location: loc?) -> void
30
32
 
31
33
  def ==: (untyped other) -> bool
34
+
35
+ include Located
32
36
  end
33
37
 
34
38
  class ReturnType < Typed
@@ -49,34 +53,25 @@ module Steep
49
53
  class BreakType < Typed
50
54
  end
51
55
 
52
- class MethodType < Named
56
+ class MethodType < Named[Interface::MethodType, Symbol]
53
57
  end
54
58
 
55
- class VarType < Named
59
+ class VarType < Named[Types::t, Symbol]
56
60
  end
57
61
 
58
- class ConstType < Named
59
- attr_reader name: RBS::TypeName
60
-
61
- attr_reader type: Types::t
62
-
63
- attr_reader location: loc?
64
-
65
- def initialize: (name: RBS::TypeName, type: untyped, ?location: loc?) -> void
66
-
67
- def ==: (untyped other) -> bool
62
+ class ConstType < Named[Types::t, RBS::TypeName]
68
63
  end
69
64
 
70
- class IvarType < Named
65
+ class IvarType < Named[Types::t, Symbol]
71
66
  end
72
67
 
73
68
  class Implements
74
69
  class Module
75
70
  attr_reader name: RBS::TypeName
76
71
 
77
- attr_reader args: Array[Types::t]
72
+ attr_reader args: Array[Symbol]
78
73
 
79
- def initialize: (name: RBS::TypeName, args: Array[Types::t]) -> void
74
+ def initialize: (name: RBS::TypeName, args: Array[Symbol]) -> void
80
75
 
81
76
  def ==: (untyped other) -> bool
82
77
 
@@ -85,7 +80,7 @@ module Steep
85
80
  def hash: () -> Integer
86
81
  end
87
82
 
88
- attr_reader location: loc?
83
+ include Located
89
84
 
90
85
  attr_reader name: Module
91
86
 
@@ -113,7 +108,7 @@ module Steep
113
108
  def ==: (untyped other) -> bool
114
109
  end
115
110
 
116
- attr_reader location: loc?
111
+ include Located
117
112
 
118
113
  attr_reader names: Array[Name]
119
114
 
@@ -0,0 +1,31 @@
1
+ module Steep
2
+ module AST
3
+ module Node
4
+ class TypeApplication
5
+ attr_reader location: RBS::Location[untyped, untyped]
6
+
7
+ attr_reader node: Parser::AST::Node
8
+
9
+ def line: () -> Integer
10
+
11
+ def source: () -> String
12
+
13
+ def initialize: (RBS::Location[untyped, untyped]) -> void
14
+
15
+ def types: (RBS::Resolver::context, Types::Factory, Array[Symbol] type_vars) -> (Array[Types::t] | RBS::ParsingError)
16
+
17
+ def types?: (RBS::Resolver::context, Types::Factory, Array[Symbol] type_vars) -> Array[Types::t]?
18
+
19
+ @type_str: String?
20
+ def type_str: () -> String
21
+
22
+ def type_location: () -> RBS::Location[untyped, untyped]
23
+
24
+ # Set the back reference to the `:tapp` node
25
+ def set_node: (Parser::AST::Node) -> void
26
+
27
+ def self.parse: (RBS::Location[untyped, untyped]) -> TypeApplication?
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ module Steep
2
+ module AST
3
+ module Node
4
+ class TypeAssertion
5
+ attr_reader location: RBS::Location[untyped, untyped]
6
+
7
+ def source: () -> String
8
+
9
+ def line: () -> Integer
10
+
11
+ def initialize: (RBS::Location[untyped, untyped]) -> void
12
+
13
+ def type: (RBS::Resolver::context, Types::Factory, Array[Symbol] type_vars) -> (Types::t | RBS::ParsingError | nil)
14
+
15
+ def type?: (RBS::Resolver::context, Types::Factory, Array[Symbol] type_vars) -> Types::t?
16
+
17
+ @type_str: String?
18
+ def type_str: () -> String
19
+
20
+ def type_location: () -> RBS::Location[untyped, untyped]
21
+
22
+ def self.parse: (RBS::Location[untyped, untyped]) -> TypeAssertion?
23
+ end
24
+ end
25
+ end
26
+ end
@@ -4,8 +4,6 @@ module Steep
4
4
  class Factory
5
5
  @env: RBS::Environment
6
6
 
7
- @type_name_resolver: RBS::Resolver::TypeNameResolver
8
-
9
7
  attr_reader definition_builder: RBS::DefinitionBuilder
10
8
 
11
9
  attr_reader type_cache: Hash[RBS::Types::t, t]
@@ -1,9 +1,15 @@
1
1
  module Steep
2
2
  module Diagnostic
3
- module Helper
4
- def error_name: () -> untyped
3
+ module Helper : _DiagnosticMessage
4
+ def error_name: () -> String
5
5
 
6
- def full_message: () -> ::String
6
+ def full_message: () -> String
7
+ end
8
+
9
+ interface _DiagnosticMessage
10
+ %a{pure} def detail_lines: () -> String?
11
+
12
+ def header_line: () -> String
7
13
  end
8
14
  end
9
15
  end
@@ -1,11 +1,15 @@
1
1
  module Steep
2
2
  module Diagnostic
3
3
  class LSPFormatter
4
- LSP: untyped
4
+ LSP: singleton(LanguageServer::Protocol)
5
5
 
6
- attr_reader config: untyped
6
+ type config = Hash[singleton(Diagnostic::Ruby::Base) | singleton(Diagnostic::Signature::Base), severity?]
7
7
 
8
- attr_reader default_severity: untyped
8
+ type severity = :error | :warning | :information | :hint
9
+
10
+ attr_reader config: config
11
+
12
+ attr_reader default_severity: severity
9
13
 
10
14
  ERROR: :error
11
15
 
@@ -15,15 +19,15 @@ module Steep
15
19
 
16
20
  HINT: :hint
17
21
 
18
- def initialize: (?::Hash[untyped, untyped] config, ?default_severity: untyped) -> void
22
+ def initialize: (?config config, ?default_severity: severity) -> void
19
23
 
20
- def validate_class: (untyped klass) -> (untyped | nil)
24
+ def validate_class: (Class klass) -> void
21
25
 
22
- def validate_severity: (untyped klass, untyped severity) -> untyped
26
+ def validate_severity: (Class | :default klass, severity?) -> void
23
27
 
24
- def format: (untyped diagnostic) -> untyped
28
+ def format: (Diagnostic::Ruby::Base | Diagnostic::Signature::Base) -> Hash[Symbol, untyped]?
25
29
 
26
- def severity_for: (untyped diagnostic) -> untyped
30
+ def severity_for: (Diagnostic::Ruby::Base | Diagnostic::Signature::Base) -> String?
27
31
  end
28
32
  end
29
33
  end
@@ -1,7 +1,7 @@
1
1
  module Steep
2
2
  module Diagnostic
3
3
  module Ruby
4
- type location = Parser::Source::Range | Parser::Source::Range
4
+ type location = Parser::Source::Range | RBS::Location[untyped, untyped]
5
5
 
6
6
  class Base
7
7
  include Helper
@@ -384,11 +384,11 @@ module Steep
384
384
  class IncompatibleAnnotation < Base
385
385
  attr_reader result: Subtyping::Result::Base
386
386
 
387
- attr_reader relation: Subtyping::Relation
387
+ attr_reader relation: Subtyping::Relation[untyped]
388
388
 
389
389
  attr_reader var_name: Symbol
390
390
 
391
- def initialize: (node: Parser::AST::Node, var_name: Symbol, result: Subtyping::Result::Base, relation: Subtyping::Relation) -> void
391
+ def initialize: (node: Parser::AST::Node, var_name: Symbol, result: Subtyping::Result::Base, relation: Subtyping::Relation[untyped]) -> void
392
392
 
393
393
  include ResultPrinter
394
394
 
@@ -476,15 +476,69 @@ module Steep
476
476
  def header_line: () -> ::String
477
477
  end
478
478
 
479
- ALL: untyped
479
+ class FalseAssertion < Base
480
+ attr_reader assertion_type: AST::Types::t
480
481
 
481
- def self.all_error: () -> untyped
482
+ attr_reader node_type: AST::Types::t
482
483
 
483
- def self.default: () -> untyped
484
+ def initialize: (node: Parser::AST::Node, assertion_type: AST::Types::t, node_type: AST::Types::t) -> void
484
485
 
485
- def self.strict: () -> untyped
486
+ def header_line: () -> String
487
+ end
488
+
489
+ class UnexpectedTypeArgument < Base
490
+ attr_reader type_arg: AST::Types::t
491
+
492
+ attr_reader method_type: Interface::MethodType
493
+
494
+ def node: () -> nil
495
+
496
+ def initialize: (type_arg: AST::Types::t, method_type: Interface::MethodType) -> void
497
+
498
+ def header_line: () -> String
499
+ end
500
+
501
+ class InsufficientTypeArgument < Base
502
+ attr_reader type_args: Array[AST::Types::t]
503
+
504
+ attr_reader method_type: Interface::MethodType
505
+
506
+ def initialize: (node: Parser::AST::Node, type_args: Array[AST::Types::t], method_type: Interface::MethodType) -> void
507
+
508
+ def header_line: () -> String
509
+ end
510
+
511
+ class TypeArgumentMismatchError < Base
512
+ attr_reader type_argument: AST::Types::t
513
+
514
+ attr_reader type_parameter: Interface::TypeParam
515
+
516
+ attr_reader result: Subtyping::Result::Base
517
+
518
+ include ResultPrinter
519
+
520
+ def node: () -> nil
521
+
522
+ def initialize: (type_arg: AST::Types::t, type_param: Interface::TypeParam, result: Subtyping::Result::Base) -> void
523
+
524
+ def header_line: () -> String
525
+ end
526
+
527
+ ALL: Array[singleton(Base)]
528
+
529
+ type template = Hash[singleton(Base), LSPFormatter::severity]
530
+
531
+ self.@all_error: template?
532
+ def self.all_error: () -> template
533
+
534
+ self.@default: template?
535
+ def self.default: () -> template
536
+
537
+ self.@strict: template?
538
+ def self.strict: () -> template
486
539
 
487
- def self.lenient: () -> untyped
540
+ self.@lenient: template?
541
+ def self.lenient: () -> template
488
542
  end
489
543
  end
490
544
  end