steep 1.4.0.dev.1 → 1.4.0.dev.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -2
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +13 -15
  5. data/Gemfile.steep +1 -2
  6. data/Gemfile.steep.lock +20 -18
  7. data/README.md +7 -1
  8. data/Steepfile +16 -3
  9. data/bin/rbs +0 -1
  10. data/guides/README.md +5 -0
  11. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +143 -0
  12. data/guides/src/getting-started/getting-started.md +164 -0
  13. data/guides/src/nil-optional/nil-optional.md +195 -0
  14. data/lib/steep/annotation_parser.rb +40 -20
  15. data/lib/steep/ast/types/factory.rb +56 -10
  16. data/lib/steep/ast/types/name.rb +10 -0
  17. data/lib/steep/diagnostic/ruby.rb +80 -5
  18. data/lib/steep/diagnostic/signature.rb +40 -0
  19. data/lib/steep/drivers/check.rb +4 -4
  20. data/lib/steep/index/rbs_index.rb +12 -3
  21. data/lib/steep/index/signature_symbol_provider.rb +1 -1
  22. data/lib/steep/interface/block.rb +10 -0
  23. data/lib/steep/module_helper.rb +13 -11
  24. data/lib/steep/path_helper.rb +4 -0
  25. data/lib/steep/project/target.rb +1 -3
  26. data/lib/steep/server/interaction_worker.rb +102 -72
  27. data/lib/steep/server/lsp_formatter.rb +14 -5
  28. data/lib/steep/services/completion_provider.rb +10 -12
  29. data/lib/steep/services/goto_service.rb +15 -14
  30. data/lib/steep/services/hover_provider/rbs.rb +29 -9
  31. data/lib/steep/services/hover_provider/ruby.rb +16 -10
  32. data/lib/steep/services/signature_service.rb +36 -39
  33. data/lib/steep/services/type_name_completion.rb +157 -0
  34. data/lib/steep/signature/validator.rb +28 -6
  35. data/lib/steep/source.rb +1 -0
  36. data/lib/steep/subtyping/check.rb +1 -1
  37. data/lib/steep/type_construction.rb +414 -239
  38. data/lib/steep/type_inference/block_params.rb +13 -0
  39. data/lib/steep/type_inference/constant_env.rb +7 -3
  40. data/lib/steep/type_inference/context.rb +3 -3
  41. data/lib/steep/type_inference/method_params.rb +42 -16
  42. data/lib/steep/type_inference/send_args.rb +79 -50
  43. data/lib/steep/type_inference/type_env.rb +7 -1
  44. data/lib/steep/version.rb +1 -1
  45. data/lib/steep.rb +1 -0
  46. data/rbs_collection.steep.lock.yaml +9 -41
  47. data/rbs_collection.steep.yaml +11 -8
  48. data/sample/lib/conference.rb +22 -0
  49. data/sample/sig/conference.rbs +28 -0
  50. data/sig/shims/language-server_protocol.rbs +12 -0
  51. data/sig/shims/parser/nodes.rbs +37 -0
  52. data/sig/shims/parser.rbs +1 -0
  53. data/sig/shims/string.rbs +4 -0
  54. data/sig/steep/annotation_parser.rbs +3 -2
  55. data/sig/steep/ast/annotation/collection.rbs +1 -1
  56. data/sig/steep/ast/types/factory.rbs +12 -8
  57. data/sig/steep/ast/types/name.rbs +4 -0
  58. data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
  59. data/sig/steep/diagnostic/ruby.rbs +38 -2
  60. data/sig/steep/diagnostic/signature.rbs +18 -14
  61. data/sig/steep/drivers/check.rbs +1 -1
  62. data/sig/steep/drivers/checkfile.rbs +1 -1
  63. data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
  64. data/sig/steep/drivers/watch.rbs +1 -1
  65. data/sig/steep/index/rbs_index.rbs +6 -2
  66. data/sig/steep/index/signature_symbol_provider.rbs +1 -1
  67. data/sig/steep/interface/block.rbs +2 -0
  68. data/sig/steep/interface/builder.rbs +5 -3
  69. data/sig/steep/interface/method_type.rbs +5 -3
  70. data/sig/steep/module_helper.rbs +9 -0
  71. data/sig/steep/path_helper.rbs +3 -1
  72. data/sig/steep/project/target.rbs +7 -7
  73. data/sig/steep/server/base_worker.rbs +1 -1
  74. data/sig/steep/server/interaction_worker.rbs +46 -17
  75. data/sig/steep/server/lsp_formatter.rbs +4 -2
  76. data/sig/steep/server/master.rbs +1 -1
  77. data/sig/steep/server/type_check_worker.rbs +7 -5
  78. data/sig/steep/server/worker_process.rbs +6 -4
  79. data/sig/steep/services/completion_provider.rbs +8 -0
  80. data/sig/steep/services/hover_provider/rbs.rbs +6 -4
  81. data/sig/steep/services/hover_provider/ruby.rbs +8 -4
  82. data/sig/steep/services/signature_service.rbs +27 -3
  83. data/sig/steep/services/type_name_completion.rbs +122 -0
  84. data/sig/steep/signature/validator.rbs +9 -5
  85. data/sig/steep/type_construction.rbs +100 -31
  86. data/sig/steep/type_inference/block_params.rbs +4 -0
  87. data/sig/steep/type_inference/constant_env.rbs +2 -0
  88. data/sig/steep/type_inference/context.rbs +70 -22
  89. data/sig/steep/type_inference/method_params.rbs +43 -24
  90. data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
  91. data/sig/steep/type_inference/send_args.rbs +13 -3
  92. data/sig/steep/typing.rbs +7 -2
  93. data/smoke/diagnostics/test_expectations.yml +1 -0
  94. data/smoke/regexp/a.rb +2 -2
  95. data/steep.gemspec +0 -1
  96. metadata +11 -17
@@ -51,6 +51,12 @@ module Steep
51
51
  attr_reader full_name: RBS::TypeName
52
52
 
53
53
  def initialize: (env: RBS::Environment, identifier: Symbol, range: Range, type: AST::Types::t, full_name: RBS::TypeName) -> void
54
+
55
+ def class?: () -> bool
56
+
57
+ def module?: () -> bool
58
+
59
+ def comments: () -> Array[RBS::AST::Comment]
54
60
  end
55
61
 
56
62
  class MethodNameItem
@@ -71,6 +77,8 @@ module Steep
71
77
  def inherited?: () -> bool
72
78
  end
73
79
 
80
+ type item = InstanceVariableItem | LocalVariableItem | ConstantItem | MethodNameItem
81
+
74
82
  attr_reader source_text: String
75
83
 
76
84
  attr_reader path: Pathname
@@ -5,17 +5,19 @@ module Steep
5
5
  class TypeAliasContent
6
6
  attr_reader location: ::RBS::Location[untyped, untyped]
7
7
 
8
- attr_reader decl: ::RBS::AST::Declarations::Alias
8
+ attr_reader decl: ::RBS::AST::Declarations::TypeAlias
9
9
 
10
- def initialize: (location: ::RBS::Location[untyped, untyped], decl: ::RBS::AST::Declarations::Alias) -> void
10
+ def initialize: (location: ::RBS::Location[untyped, untyped], decl: ::RBS::AST::Declarations::TypeAlias) -> void
11
11
  end
12
12
 
13
13
  class ClassContent
14
14
  attr_reader location: ::RBS::Location[untyped, untyped]
15
15
 
16
- attr_reader decl: ::RBS::AST::Declarations::Class | ::RBS::AST::Declarations::Module
16
+ type decl = ::RBS::AST::Declarations::Class | ::RBS::AST::Declarations::Module | ::RBS::AST::Declarations::ClassAlias | ::RBS::AST::Declarations::ModuleAlias
17
17
 
18
- def initialize: (location: ::RBS::Location[untyped, untyped], decl: ::RBS::AST::Declarations::Class | ::RBS::AST::Declarations::Module) -> void
18
+ attr_reader decl: decl
19
+
20
+ def initialize: (location: ::RBS::Location[untyped, untyped], decl: decl) -> void
19
21
  end
20
22
 
21
23
  class InterfaceContent
@@ -82,23 +82,27 @@ module Steep
82
82
 
83
83
  type decl = ::RBS::Environment::ClassEntry
84
84
  | ::RBS::Environment::ModuleEntry
85
- | ::RBS::Environment::SingleEntry[::RBS::TypeName, ::RBS::AST::Declarations::Constant]
85
+ | ::RBS::Environment::ClassAliasEntry
86
+ | ::RBS::Environment::ModuleAliasEntry
87
+ | ::RBS::Environment::ConstantEntry
86
88
 
87
89
  attr_reader decl: decl
88
90
 
89
91
  attr_reader class_decl(): ::RBS::Environment::ClassEntry | ::RBS::Environment::ModuleEntry | nil
90
92
 
91
- attr_reader constant_decl(): ::RBS::Environment::SingleEntry[::RBS::TypeName, ::RBS::AST::Declarations::Constant]?
93
+ attr_reader class_alias(): ::RBS::Environment::ClassAliasEntry | ::RBS::Environment::ModuleAliasEntry | nil
94
+
95
+ attr_reader constant_decl(): ::RBS::Environment::ConstantEntry?
92
96
 
93
97
  def initialize: (location: Parser::Source::Range, full_name: ::RBS::TypeName, type: AST::Types::t, decl: decl) -> void
94
98
 
95
99
  def comments: () -> Array[::RBS::AST::Comment]
96
100
 
97
101
  # Returns true if `decl` is a class/module definition
98
- def class_or_module?: () -> (::RBS::Environment::ClassEntry | ::RBS::Environment::ModuleEntry | nil)
102
+ def class_or_module?: () -> bool
99
103
 
100
104
  # Returns true if `decl` is a constant definition
101
- def constant?: () -> ::RBS::Environment::SingleEntry[::RBS::TypeName, ::RBS::AST::Declarations::Constant]?
105
+ def constant?: () -> bool
102
106
  end
103
107
 
104
108
  type content = TypeContent | VariableContent | MethodCallContent | DefinitionContent | ConstantContent | TypeAssertionContent
@@ -1,5 +1,12 @@
1
1
  module Steep
2
2
  module Services
3
+ # SignatureService takes care of two sets of RBS files.
4
+ #
5
+ # 1. RBS files loaded from `EnvironmentLoader` -- usually type signatures of libraries
6
+ # 2. RBS files managed in editors -- usually type signatures of the development target (app or gem)
7
+ #
8
+ # The files in #2 are managed throuth `#status` and the changes are tracked.
9
+ #
3
10
  class SignatureService
4
11
  type status = SyntaxErrorStatus | AncestorErrorStatus | LoadedStatus
5
12
 
@@ -65,17 +72,25 @@ module Steep
65
72
  def constant_resolver: () -> RBS::Resolver::ConstantResolver
66
73
  end
67
74
 
75
+ # A file has one of the three states:
76
+ #
77
+ # 1. The parsing succeeded and loaded a list of declarations
78
+ # 2. The content has a syntax error and parsing failed
79
+ # 3. Other unexpected error
80
+ #
68
81
  class FileStatus
69
82
  attr_reader path: Pathname
70
83
 
71
84
  attr_reader content: String
72
85
 
73
- attr_reader decls: Array[RBS::AST::Declarations::t] | Diagnostic::Signature::UnexpectedError | RBS::ParsingError
86
+ type signature = [RBS::Buffer, Array[RBS::AST::Directives::t], Array[RBS::AST::Declarations::t]]
87
+
88
+ attr_reader signature: signature | Diagnostic::Signature::UnexpectedError | RBS::ParsingError
74
89
 
75
90
  def initialize: (
76
91
  path: Pathname,
77
92
  content: String,
78
- decls: Array[RBS::AST::Declarations::t] | Diagnostic::Signature::UnexpectedError | RBS::ParsingError
93
+ signature: signature | Diagnostic::Signature::UnexpectedError | RBS::ParsingError
79
94
  ) -> void
80
95
  end
81
96
 
@@ -85,11 +100,17 @@ module Steep
85
100
 
86
101
  @env_rbs_paths: Set[Pathname]?
87
102
 
103
+ # All RBS paths in environment, both dependency RBS and target RBS
104
+ #
88
105
  def env_rbs_paths: () -> Set[Pathname]
89
106
 
107
+ # Yield all RBS paths in the environment, both dependency RBS and target RBS
108
+ #
90
109
  def each_rbs_path: () { (Pathname) -> void } -> void
91
110
  | () -> Enumerator[Pathname, void]
92
111
 
112
+ # The Target files
113
+ #
93
114
  def files: () -> Hash[Pathname, FileStatus]
94
115
 
95
116
  def pending_changed_paths: () -> Set[Pathname]
@@ -106,10 +127,13 @@ module Steep
106
127
 
107
128
  def apply_changes: (Hash[Pathname, FileStatus] files, Server::ChangeBuffer::changes changes) -> Hash[Pathname, FileStatus]
108
129
 
130
+ # The entry point to apply the edit to the signatures
131
+ #
109
132
  def update: (Server::ChangeBuffer::changes changes) -> void
110
133
 
111
134
  def update_env: (
112
- Hash[Pathname, FileStatus] updated_files, paths: Set[Pathname]
135
+ Hash[Pathname, FileStatus] updated_files,
136
+ paths: Set[Pathname]
113
137
  ) -> (RBS::DefinitionBuilder::AncestorBuilder | Array[Diagnostic::Signature::Base])
114
138
 
115
139
  def rescue_rbs_error: (Array[RBS::BaseError] errors) { () -> void } -> void
@@ -0,0 +1,122 @@
1
+ use RBS::TypeName, RBS::Namespace, RBS::Environment, RBS::Resolver, RBS::AST::Directives
2
+
3
+ module Steep
4
+ module Services
5
+ class TypeNameCompletion
6
+ module Prefix
7
+ type t = nil # no prefix
8
+ | RawIdentPrefix
9
+ | NamespacedIdentPrefix
10
+ | NamespacePrefix
11
+
12
+ # Uident or Lident is given, but no `::` (==namespace)
13
+ #
14
+ # ```
15
+ # Str← Uident
16
+ # c← Lident
17
+ # ```
18
+ #
19
+ class RawIdentPrefix
20
+ attr_reader ident: String
21
+
22
+ # Returns true if the `ident` is a Ruby class name
23
+ #
24
+ def const_name?: () -> bool
25
+
26
+ def initialize: (String ident) -> void
27
+
28
+ def size: () -> Integer
29
+ end
30
+
31
+ # Uident or Lident following a namespace
32
+ #
33
+ # ```
34
+ # ::L← Uident
35
+ # RBS::Enviro← Uident
36
+ # ```
37
+ #
38
+ class NamespacedIdentPrefix
39
+ attr_reader namespace: Namespace
40
+
41
+ attr_reader ident: String
42
+
43
+ def const_name?: () -> bool
44
+
45
+ def initialize: (Namespace, String ident, Integer size) -> void
46
+
47
+ def size: () -> Integer
48
+ end
49
+
50
+ # Namespace is given
51
+ #
52
+ # ```
53
+ # RBS::←
54
+ # ::←
55
+ # ```
56
+ class NamespacePrefix
57
+ attr_reader namespace: Namespace
58
+
59
+ def initialize: (Namespace, Integer size) -> void
60
+
61
+ def size: () -> Integer
62
+ end
63
+
64
+ # line number is 1 origin (Rubyish)
65
+ #
66
+ def self.parse: (RBS::Buffer input, line: Integer, column: Integer) -> t
67
+ end
68
+
69
+ class Item
70
+ # The text to be completed
71
+ #
72
+ attr_reader complete_text: String
73
+
74
+ # The prefix
75
+ attr_reader prefix: Prefix::t?
76
+
77
+ # Name of the type or constant
78
+ #
79
+ attr_reader full_name: TypeName
80
+
81
+ # The text to be inserted after the prefix
82
+ #
83
+ def insert_text: () -> String
84
+
85
+ def initialize: (prefix: Prefix::t?, full_name: TypeName, complete_text: String) -> void
86
+ end
87
+
88
+ attr_reader env: Environment
89
+
90
+ attr_reader context: Resolver::context
91
+
92
+ attr_reader type_name_resolver: Resolver::TypeNameResolver
93
+
94
+ attr_reader map: Environment::UseMap
95
+
96
+ def initialize: (env: Environment, context: Resolver::context, dirs: Array[Directives::t]) -> void
97
+
98
+ def complete_class_name: (RBS::Buffer input, line: Integer, column: Integer) -> Array[Item]
99
+
100
+ # Find type names from the context for RBS
101
+ #
102
+ # Doesn't take account of ancestors of the context.
103
+ #
104
+ def find_type_names: (Prefix::t) -> Array[TypeName]
105
+
106
+ # Returns a pair of
107
+ #
108
+ # * Absolute type name
109
+ # * Relative type name in given context if possible (or absolute name)
110
+ #
111
+ def resolve_name_in_context: (TypeName) -> [TypeName, TypeName]
112
+
113
+ def format_constant_name: (TypeName) -> String
114
+
115
+ def each_type_name: () { (TypeName) -> void } -> void
116
+ | () -> Enumerator[TypeName, void]
117
+
118
+ def each_outer_module: (?Resolver::context) { (Namespace) -> void } -> Namespace
119
+ | () -> Enumerator[Namespace, void]
120
+ end
121
+ end
122
+ end
@@ -9,7 +9,7 @@ module Steep
9
9
 
10
10
  @errors: Array[Diagnostic::Signature::Base]
11
11
 
12
- @type_name_resolver: RBS::TypeNameResolver?
12
+ @type_name_resolver: RBS::Resolver::TypeNameResolver?
13
13
 
14
14
  @validator: RBS::Validator?
15
15
 
@@ -26,7 +26,7 @@ module Steep
26
26
 
27
27
  def builder: () -> RBS::DefinitionBuilder
28
28
 
29
- def type_name_resolver: () -> RBS::TypeNameResolver
29
+ def type_name_resolver: () -> RBS::Resolver::TypeNameResolver
30
30
 
31
31
  def validator: () -> RBS::Validator
32
32
 
@@ -60,13 +60,17 @@ module Steep
60
60
 
61
61
  def validate_const: () -> void
62
62
 
63
- def validate_one_constant: (RBS::TypeName name, RBS::Environment::SingleEntry[RBS::TypeName, RBS::AST::Declarations::Constant] entry) -> void
63
+ def validate_one_constant: (RBS::TypeName name, RBS::Environment::ConstantEntry entry) -> void
64
64
 
65
65
  def validate_global: () -> void
66
66
 
67
- def validate_one_global: (Symbol name, RBS::Environment::SingleEntry[Symbol, RBS::AST::Declarations::Global]) -> void
67
+ def validate_one_global: (Symbol name, RBS::Environment::GlobalEntry) -> void
68
68
 
69
- def validate_one_alias: (RBS::TypeName name, ?RBS::Environment::SingleEntry[RBS::TypeName, RBS::AST::Declarations::Alias] entry) -> void
69
+ def validate_one_alias: (RBS::TypeName name, ?RBS::Environment::TypeAliasEntry entry) -> void
70
+
71
+ def validate_one_class_decl: (RBS::TypeName) -> void
72
+
73
+ def validate_one_class_alias: (RBS::TypeName, RBS::Environment::ClassAliasEntry | RBS::Environment::ModuleAliasEntry) -> void
70
74
 
71
75
  def validate_alias: () -> void
72
76
 
@@ -20,6 +20,8 @@ module Steep
20
20
 
21
21
  include NodeHelper
22
22
 
23
+ include ModuleHelper
24
+
23
25
  attr_reader checker: Subtyping::Check
24
26
 
25
27
  attr_reader source: Source
@@ -30,9 +32,7 @@ module Steep
30
32
 
31
33
  attr_reader context: TypeInference::Context
32
34
 
33
- %a{pure} def module_context: () -> TypeInference::Context::ModuleContext?
34
-
35
- def module_context!: () -> TypeInference::Context::ModuleContext
35
+ %a{pure} def module_context: () -> TypeInference::Context::ModuleContext
36
36
 
37
37
  %a{pure} def method_context: () -> TypeInference::Context::MethodContext?
38
38
 
@@ -40,6 +40,8 @@ module Steep
40
40
 
41
41
  %a{pure} def block_context: () -> TypeInference::Context::BlockContext?
42
42
 
43
+ def block_context!: () -> TypeInference::Context::BlockContext
44
+
43
45
  %a{pure} def break_context: () -> TypeInference::Context::BreakContext?
44
46
 
45
47
  %a{pure} def self_type: () -> AST::Types::t
@@ -58,7 +60,7 @@ module Steep
58
60
 
59
61
  def update_type_env: () { (TypeInference::TypeEnv) -> TypeInference::TypeEnv } -> TypeConstruction
60
62
 
61
- def check_relation: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::Base
63
+ def check_relation: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::t
62
64
 
63
65
  # This is a variation of `#check_relation` method.
64
66
  # It checks if given subtyping relation `sub_type <: super_type` holds or not, and returns truthy when *doesn't* hold.
@@ -80,9 +82,9 @@ module Steep
80
82
 
81
83
  def with_method_constr: (untyped method_name, untyped node, args: untyped, self_type: untyped, definition: untyped) { (untyped) -> untyped } -> untyped
82
84
 
83
- def implement_module: (module_name: untyped, annotations: untyped, ?super_name: untyped?) -> untyped
85
+ def implement_module: (module_name: RBS::TypeName, annotations: AST::Annotation::Collection, ?super_name: RBS::TypeName?) -> AST::Annotation::Implements::Module?
84
86
 
85
- def default_module_context: (untyped implement_module_name, nesting: untyped) -> untyped
87
+ def default_module_context: (AST::Annotation::Implements::Module? implement_module_name, nesting: RBS::Resolver::context) -> TypeInference::Context::ModuleContext
86
88
 
87
89
  def for_module: (untyped node, untyped new_module_name) -> untyped
88
90
 
@@ -104,7 +106,7 @@ module Steep
104
106
 
105
107
  def for_sclass: (Parser::AST::Node node, AST::Types::t `type`) -> TypeConstruction?
106
108
 
107
- def for_branch: (Parser::AST::Node node, ?break_context: TypeInference::Context::BreakContext?) -> untyped
109
+ def for_branch: (Parser::AST::Node node, ?break_context: TypeInference::Context::BreakContext?) -> TypeConstruction
108
110
 
109
111
  def add_typing: (Parser::AST::Node node, type: AST::Types::t, ?constr: TypeConstruction) -> Pair
110
112
 
@@ -112,7 +114,7 @@ module Steep
112
114
 
113
115
  def synthesize: (Parser::AST::Node node, ?hint: AST::Types::t?, ?condition: bool) -> Pair
114
116
 
115
- def check: (Parser::AST::Node node, AST::Types::t `type`, ?constraints: Subtyping::Constraints) { (AST::Types::t, AST::Types::t, Subtyping::Result::Base) -> void } -> Pair
117
+ def check: (Parser::AST::Node node, AST::Types::t `type`, ?constraints: Subtyping::Constraints) { (AST::Types::t, AST::Types::t, Subtyping::Result::t) -> void } -> Pair
116
118
 
117
119
  def masgn_lhs?: (untyped lhs) -> untyped
118
120
 
@@ -126,13 +128,43 @@ module Steep
126
128
 
127
129
  def constant_typename: (Parser::AST::Node parent, Symbol name) -> RBS::TypeName?
128
130
 
129
- def synthesize_constant: (Parser::AST::Node node, Parser::AST::Node? parent_node, Symbol constant_name) { () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
131
+ # Synthesize a constant declaration -- :cdecl, :class, or :module
132
+ #
133
+ # * `node` is the node that references a constant
134
+ # * `parent_node` is the parent (namespace) of a constant reference
135
+ # * `constant_name` is the name of constant
136
+ #
137
+ # Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
138
+ #
139
+ # Returns a tuple of
140
+ #
141
+ # * The type of the constant
142
+ # * TypeConstruction instance after the evaluation
143
+ # * The full name of the constant
144
+ #
145
+ def synthesize_constant_decl: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
146
+
147
+ # Synthesize a constant reference
148
+ #
149
+ # * `node` is the node that references a constant
150
+ # * `parent_node` is the parent (namespace) of a constant reference
151
+ # * `constant_name` is the name of constant
152
+ #
153
+ # Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
154
+ #
155
+ # Returns a tuple of
156
+ #
157
+ # * The type of the constant
158
+ # * TypeConstruction instance after the evaluation
159
+ # * The full name of the constant
160
+ #
161
+ def synthesize_constant: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
130
162
 
131
163
  def optional_proc?: (untyped `type`) -> (untyped | nil | nil | nil | nil)
132
164
 
133
- def type_lambda: (Parser::AST::Node node, params_node: Parser::AST::Node, body_node: Parser::AST::Node, type_hint: AST::Types::t?) -> Pair
165
+ def type_lambda: (Parser::AST::Node & Parser::AST::_BlockNode node, params_node: Parser::AST::Node, body_node: Parser::AST::Node, type_hint: AST::Types::t?) -> Pair
134
166
 
135
- def synthesize_children: (Parser::AST::Node node, ?skips: Array[Parser::AST::Node]) -> TypeConstruction
167
+ def synthesize_children: (Parser::AST::Node node, ?skips: Array[Parser::AST::Node?]) -> TypeConstruction
136
168
 
137
169
  # Synthesize `:send`, `:csend`, `:block`, and `:numblock` node
138
170
  #
@@ -255,7 +287,13 @@ module Steep
255
287
 
256
288
  def eliminate_vars: (untyped `type`, untyped variables, ?to: untyped) -> untyped
257
289
 
290
+ # Type check arguments
291
+ #
292
+ # * Receives the `method_name` of a method that is being called
293
+ # * `method_name` is `nil` if it type checks arguments of block or proc
294
+ #
258
295
  def type_check_args: (
296
+ Symbol | nil,
259
297
  TypeInference::SendArgs,
260
298
  Subtyping::Constraints,
261
299
  Array[Diagnostic::Ruby::Base]
@@ -263,7 +301,7 @@ module Steep
263
301
 
264
302
  def type_check_argument: (Parser::AST::Node node, type: AST::Types::t, constraints: Subtyping::Constraints, errors: Array[Diagnostic::Ruby::Base], ?report_node: Parser::AST::Node) -> Pair
265
303
 
266
- def type_block_without_hint: (node: Parser::AST::Node, block_annotations: AST::Annotation::Collection, block_params: TypeInference::BlockParams?, block_body: Parser::AST::Node?) ?{ (Diagnostic::Ruby::Base) -> void } -> void
304
+ def type_block_without_hint: (node: Parser::AST::Node & Parser::AST::_BlockNode, block_annotations: AST::Annotation::Collection, block_params: TypeInference::BlockParams?, block_body: Parser::AST::Node?) ?{ (Diagnostic::Ruby::Base) -> void } -> void
267
305
 
268
306
  def set_up_block_mlhs_params_env: (
269
307
  Parser::AST::Node mlhs_node,
@@ -299,15 +337,19 @@ module Steep
299
337
 
300
338
  # Synthesize the block body and returns the type of the body
301
339
  #
302
- # The constructor can be discarded because it cannot change anything outer than block.
340
+ # The constructor can be safely discarded because it cannot change anything outer than block.
303
341
  #
304
- def synthesize_block: (node: Parser::AST::Node, block_type_hint: AST::Types::t?, block_body: Parser::AST::Node?) -> AST::Types::t
342
+ def synthesize_block: (
343
+ node: Parser::AST::Node & Parser::AST::_BlockNode,
344
+ block_type_hint: AST::Types::t?,
345
+ block_body: Parser::AST::Node?
346
+ ) -> AST::Types::t
305
347
 
306
- def nesting: () -> RBS::Resolver::context
348
+ %a{pure} def nesting: () -> RBS::Resolver::context
307
349
 
308
350
  def absolute_name: (untyped name) -> untyped
309
351
 
310
- def union_type: (*AST::Types::t types) -> AST::Types::t
352
+ def union_type: (*AST::Types::t? types) -> AST::Types::t
311
353
 
312
354
  # Returns union type of given types
313
355
  #
@@ -328,27 +370,35 @@ module Steep
328
370
  #
329
371
  def union_of_tuple_to_tuple_of_union: (AST::Types::Union) -> AST::Types::Tuple?
330
372
 
331
- def validate_method_definitions: (untyped node, untyped module_name) -> (nil | untyped)
373
+ def validate_method_definitions: (Parser::AST::Node node, AST::Annotation::Implements::Module module_name) -> void
332
374
 
333
375
  def fallback_to_any: (Parser::AST::Node node) ?{ () -> Diagnostic::Ruby::Base } -> Pair
334
376
 
335
- def self_class?: (untyped node) -> untyped
377
+ # Return `true` if `node` is `self.class`
378
+ def self_class?: (Parser::AST::Node node) -> bool
336
379
 
337
- def namespace_module?: (untyped node) -> (false | untyped)
380
+ # Returns `true` if the given `node` is a `class` or `module` declaration that only contains module/class definitions
381
+ #
382
+ def namespace_module?: (Parser::AST::Node node) -> bool
338
383
 
339
384
  def type_any_rec: (Parser::AST::Node node) -> Pair
340
385
 
341
386
  def unwrap: (AST::Types::t `type`) -> AST::Types::t
342
387
 
388
+ # Returns `nil` if `type` is recursive
389
+ #
390
+ # See `Factory#deep_expand_alias`.
391
+ #
343
392
  def deep_expand_alias: (AST::Types::t `type`) -> AST::Types::t?
344
393
 
345
- def flatten_union: (AST::Types::t `type`) -> Array[AST::Types::t]
394
+ # `A | B | ... | Z` => `[A, B, ..., Z]`
395
+ def flatten_union: (AST::Types::t) -> Array[AST::Types::t]
346
396
 
347
- def select_flatten_types: (untyped `type`) { () -> untyped } -> untyped
397
+ def select_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> Array[AST::Types::t]
348
398
 
349
- def partition_flatten_types: (AST::Types::t `type`) { (AST::Types::t) -> boolish } -> [Array[AST::Types::t], Array[AST::Types::t]]
399
+ def partition_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> [Array[AST::Types::t], Array[AST::Types::t]]
350
400
 
351
- def flatten_array_elements: (untyped `type`) -> untyped
401
+ def flatten_array_elements: (AST::Types::t) -> Array[AST::Types::t]
352
402
 
353
403
  def expand_alias: (AST::Types::t `type`) -> AST::Types::t
354
404
  | [A] (AST::Types::t) { (AST::Types::t) -> A } -> A
@@ -357,7 +407,12 @@ module Steep
357
407
 
358
408
  def to_instance_type: (untyped `type`, ?args: untyped?) -> untyped
359
409
 
360
- def try_tuple_type!: (Parser::AST::Node node, ?hint: AST::Types::Tuple?) -> Pair
410
+ # Synthesize the type of a node, assuming it has tuple type when possible
411
+ #
412
+ # * Try `#try_tuple_type` if applicable, or
413
+ # * Run the normal `#synthesize` else
414
+ #
415
+ def try_tuple_type!: (Parser::AST::Node node, ?hint: AST::Types::t?) -> Pair
361
416
 
362
417
  # Try to give `array_node` a tuple type
363
418
  #
@@ -428,22 +483,36 @@ module Steep
428
483
  # * When hint is union type, it tries recursively with the union cases.
429
484
  # * Otherwise, it tries to be a hash instance.
430
485
  #
431
- def type_hash: (untyped hash_node, hint: untyped) -> untyped
486
+ def type_hash: (Parser::AST::Node hash_node, hint: AST::Types::t?) -> untyped
432
487
 
433
488
  # Returns the first one from elements of `types` that returns a type `t` where `t <: hint`.
434
489
  #
435
490
  def pick_one_of: (Array[AST::Types::t] types, range: untyped) { (AST::Types::t hint, TypeConstruction) -> Pair? } -> Pair?
436
491
 
437
- def save_typing: () -> untyped
492
+ # *Commit* the transaction (current typing) and returns a `TypeConstruction` with saved typing
493
+ #
494
+ # ```ruby
495
+ # transaction = typing.new_child(range) {|child| constr.with_new_typing(child) }
496
+ #
497
+ # # Do something that may fail
498
+ #
499
+ # if succeeded
500
+ # # Commit the may-fail operation
501
+ # constr = transaction.save_typing()
502
+ # else
503
+ # # Abort the transaction
504
+ # end
505
+ # ```
506
+ def save_typing: () -> TypeConstruction
438
507
 
439
- # Returns `true` if a method call can be identified as _pure_.
508
+ # Returns `true` if a method call can be identified as _pure_:
440
509
  #
441
- # * The `node` is not a call with call
442
- # * It always calls _pure_ method
443
- # * The `receiver` is _pure_
510
+ # * The `node` is not a call with block,
511
+ # * It always calls _pure_ method,
512
+ # * The `receiver` is _pure_, and
444
513
  # * All of the arguments are _pure_
445
514
  #
446
- def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node receiver, Array[Parser::AST::Node] arguments) -> bool
515
+ def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node? receiver, Array[Parser::AST::Node] arguments) -> bool
447
516
 
448
517
  # Transform given `node` to a node that has a local variable instead of the outer most call/non-value node
449
518
  #
@@ -149,6 +149,10 @@ module Steep
149
149
 
150
150
  def each: () { (Param | MultipleParam) -> void } -> void
151
151
  | () -> Enumerator[Param | MultipleParam, void]
152
+
153
+ # Yields `Param` recursively
154
+ #
155
+ def each_single_param: () { (Param) -> void } -> void
152
156
  end
153
157
  end
154
158
  end
@@ -21,6 +21,8 @@ module Steep
21
21
 
22
22
  def children: (RBS::TypeName module_name) -> Hash[Symbol, constant_tuple]
23
23
 
24
+ def decompose_constant!: (RBS::Constant? constant) -> constant_tuple
25
+
24
26
  def decompose_constant: (RBS::Constant? constant) -> constant_tuple?
25
27
  end
26
28
  end