steep 1.3.0.pre.1 → 1.3.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/Gemfile.lock +3 -3
  4. data/Gemfile.steep +1 -2
  5. data/Gemfile.steep.lock +4 -5
  6. data/bin/steep-prof +1 -1
  7. data/lib/steep/ast/types/class.rb +9 -3
  8. data/lib/steep/ast/types/factory.rb +9 -2
  9. data/lib/steep/ast/types/helper.rb +4 -3
  10. data/lib/steep/ast/types/instance.rb +8 -3
  11. data/lib/steep/ast/types/intersection.rb +6 -2
  12. data/lib/steep/ast/types/literal.rb +1 -1
  13. data/lib/steep/ast/types/logic.rb +5 -3
  14. data/lib/steep/ast/types/name.rb +11 -5
  15. data/lib/steep/ast/types/proc.rb +5 -5
  16. data/lib/steep/ast/types/record.rb +5 -1
  17. data/lib/steep/ast/types/self.rb +8 -2
  18. data/lib/steep/ast/types/tuple.rb +7 -5
  19. data/lib/steep/ast/types/union.rb +10 -4
  20. data/lib/steep/ast/types/var.rb +1 -1
  21. data/lib/steep/drivers/check.rb +1 -1
  22. data/lib/steep/drivers/checkfile.rb +1 -1
  23. data/lib/steep/drivers/langserver.rb +2 -2
  24. data/lib/steep/drivers/stats.rb +1 -1
  25. data/lib/steep/drivers/utils/jobs_option.rb +0 -4
  26. data/lib/steep/drivers/watch.rb +1 -1
  27. data/lib/steep/interface/substitution.rb +11 -10
  28. data/lib/steep/server/worker_process.rb +16 -11
  29. data/lib/steep/services/completion_provider.rb +2 -1
  30. data/lib/steep/services/goto_service.rb +2 -1
  31. data/lib/steep/services/hover_provider/ruby.rb +2 -1
  32. data/lib/steep/services/signature_service.rb +16 -0
  33. data/lib/steep/services/type_check_service.rb +4 -4
  34. data/lib/steep/signature/validator.rb +13 -13
  35. data/lib/steep/type_construction.rb +25 -20
  36. data/lib/steep/type_inference/logic_type_interpreter.rb +2 -2
  37. data/lib/steep/version.rb +1 -1
  38. data/lib/steep.rb +0 -1
  39. data/rbs_collection.steep.lock.yaml +1 -1
  40. data/sig/steep/ast/builtin.rbs +1 -1
  41. data/sig/steep/ast/types/any.rbs +6 -6
  42. data/sig/steep/ast/types/boolean.rbs +7 -7
  43. data/sig/steep/ast/types/bot.rbs +6 -6
  44. data/sig/steep/ast/types/class.rbs +8 -7
  45. data/sig/steep/ast/types/helper.rbs +6 -3
  46. data/sig/steep/ast/types/instance.rbs +7 -6
  47. data/sig/steep/ast/types/intersection.rbs +13 -10
  48. data/sig/steep/ast/types/literal.rbs +6 -4
  49. data/sig/steep/ast/types/logic.rbs +9 -9
  50. data/sig/steep/ast/types/name.rbs +9 -5
  51. data/sig/steep/ast/types/nil.rbs +7 -7
  52. data/sig/steep/ast/types/proc.rbs +8 -3
  53. data/sig/steep/ast/types/record.rbs +8 -9
  54. data/sig/steep/ast/types/self.rbs +8 -7
  55. data/sig/steep/ast/types/top.rbs +6 -6
  56. data/sig/steep/ast/types/tuple.rbs +6 -5
  57. data/sig/steep/ast/types/union.rbs +9 -9
  58. data/sig/steep/ast/types/var.rbs +16 -11
  59. data/sig/steep/ast/types/void.rbs +6 -6
  60. data/sig/steep/ast/types.rbs +5 -26
  61. data/sig/steep/drivers/utils/jobs_option.rbs +0 -2
  62. data/sig/steep/interface/substitution.rbs +9 -9
  63. data/sig/steep/server/worker_process.rbs +2 -2
  64. data/sig/steep/services/signature_service.rbs +14 -0
  65. data/sig/steep/services/type_check_service.rbs +2 -2
  66. data/sig/steep.rbs +2 -0
  67. data/steep.gemspec +1 -1
  68. metadata +6 -7
  69. data/lib/steep/ast/types.rb +0 -62
@@ -19,6 +19,10 @@ module Steep
19
19
  builder.env(last_builder.env)
20
20
  end
21
21
  end
22
+
23
+ def constant_resolver
24
+ @constant_resolver ||= RBS::Resolver::ConstantResolver.new(builder: last_builder)
25
+ end
22
26
  end
23
27
 
24
28
  class AncestorErrorStatus
@@ -37,6 +41,10 @@ module Steep
37
41
  builder.env(last_builder.env)
38
42
  end
39
43
  end
44
+
45
+ def constant_resolver
46
+ @constant_resolver ||= RBS::Resolver::ConstantResolver.new(builder: last_builder)
47
+ end
40
48
  end
41
49
 
42
50
  class LoadedStatus
@@ -61,6 +69,10 @@ module Steep
61
69
  builder.env(self.builder.env)
62
70
  end
63
71
  end
72
+
73
+ def constant_resolver
74
+ @constant_resolver ||= RBS::Resolver::ConstantResolver.new(builder: builder)
75
+ end
64
76
  end
65
77
 
66
78
  FileStatus = _ = Struct.new(:path, :content, :decls, keyword_init: true)
@@ -125,6 +137,10 @@ module Steep
125
137
  status.rbs_index
126
138
  end
127
139
 
140
+ def latest_constant_resolver
141
+ status.constant_resolver
142
+ end
143
+
128
144
  def current_subtyping
129
145
  if status.is_a?(LoadedStatus)
130
146
  status.subtyping
@@ -280,7 +280,7 @@ module Steep
280
280
 
281
281
  if subtyping
282
282
  text = source_files[path].content
283
- file = type_check_file(target: target, subtyping: subtyping, path: path, text: text)
283
+ file = type_check_file(target: target, subtyping: subtyping, path: path, text: text) { signature_service.latest_constant_resolver }
284
284
  yield [file.path, file.diagnostics]
285
285
  source_files[path] = file
286
286
  end
@@ -326,7 +326,7 @@ module Steep
326
326
  def type_check_file(target:, subtyping:, path:, text:)
327
327
  Steep.logger.tagged "#type_check_file(#{path}@#{target.name})" do
328
328
  source = Source.parse(text, path: path, factory: subtyping.factory)
329
- typing = TypeCheckService.type_check(source: source, subtyping: subtyping)
329
+ typing = TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: yield)
330
330
  SourceFile.with_typing(path: path, content: text, node: source.node, typing: typing)
331
331
  end
332
332
  rescue AnnotationParser::SyntaxError => exn
@@ -342,7 +342,7 @@ module Steep
342
342
  SourceFile.no_data(path: path, content: text)
343
343
  end
344
344
 
345
- def self.type_check(source:, subtyping:)
345
+ def self.type_check(source:, subtyping:, constant_resolver:)
346
346
  annotations = source.annotations(block: source.node, factory: subtyping.factory, context: nil)
347
347
 
348
348
  definition = subtyping.factory.definition_builder.build_instance(AST::Builtin::Object.module_name)
@@ -350,7 +350,7 @@ module Steep
350
350
  const_env = TypeInference::ConstantEnv.new(
351
351
  factory: subtyping.factory,
352
352
  context: nil,
353
- resolver: RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
353
+ resolver: constant_resolver
354
354
  )
355
355
  type_env = TypeInference::TypeEnv.new(const_env)
356
356
  type_env = TypeInference::TypeEnvBuilder.new(
@@ -270,9 +270,9 @@ module Steep
270
270
  mixin_constraints(definition, ancestors.included_modules || raise, immediate_self_types: ancestors.self_types).each do |relation, ancestor|
271
271
  checker.check(
272
272
  relation,
273
- self_type: AST::Types::Self.new,
274
- instance_type: AST::Types::Instance.new,
275
- class_type: AST::Types::Class.new,
273
+ self_type: AST::Types::Self.instance,
274
+ instance_type: AST::Types::Instance.instance,
275
+ class_type: AST::Types::Class.instance,
276
276
  constraints: Subtyping::Constraints.empty
277
277
  ).else do
278
278
  raise if ancestor.source.is_a?(Symbol)
@@ -314,16 +314,16 @@ module Steep
314
314
  relation = Subtyping::Relation.new(sub_type: var_type, super_type: parent_type)
315
315
  result1 = checker.check(
316
316
  relation,
317
- self_type: AST::Types::Self.new,
318
- instance_type: AST::Types::Instance.new,
319
- class_type: AST::Types::Class.new,
317
+ self_type: AST::Types::Self.instance,
318
+ instance_type: AST::Types::Instance.instance,
319
+ class_type: AST::Types::Class.instance,
320
320
  constraints: Subtyping::Constraints.empty
321
321
  )
322
322
  result2 = checker.check(
323
323
  relation.flip,
324
- self_type: AST::Types::Self.new,
325
- instance_type: AST::Types::Instance.new,
326
- class_type: AST::Types::Class.new,
324
+ self_type: AST::Types::Self.instance,
325
+ instance_type: AST::Types::Instance.instance,
326
+ class_type: AST::Types::Class.instance,
327
327
  constraints: Subtyping::Constraints.empty
328
328
  )
329
329
 
@@ -362,13 +362,13 @@ module Steep
362
362
  mixin_constraints(definition, ancestors.extended_modules, immediate_self_types: ancestors.self_types).each do |relation, ancestor|
363
363
  checker.check(
364
364
  relation,
365
- self_type: AST::Types::Self.new,
366
- instance_type: AST::Types::Instance.new,
367
- class_type: AST::Types::Class.new,
365
+ self_type: AST::Types::Self.instance ,
366
+ instance_type: AST::Types::Instance.instance,
367
+ class_type: AST::Types::Class.instance,
368
368
  constraints: Subtyping::Constraints.empty
369
369
  ).else do
370
370
  raise if ancestor.source.is_a?(Symbol)
371
-
371
+
372
372
  @errors << Diagnostic::Signature::ModuleSelfTypeError.new(
373
373
  name: name,
374
374
  location: ancestor.source&.location || raise,
@@ -3216,12 +3216,15 @@ module Steep
3216
3216
  def type_method_call(node, method_name:, receiver_type:, method:, arguments:, block_params:, block_body:, tapp:)
3217
3217
  node_range = node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }
3218
3218
 
3219
- results = method.method_types.map do |method_type|
3219
+ # @type var fails: Array[[TypeInference::MethodCall::t, TypeConstruction]]
3220
+ fails = []
3221
+
3222
+ method.method_types.each do |method_type|
3220
3223
  Steep.logger.tagged method_type.to_s do
3221
3224
  typing.new_child(node_range) do |child_typing|
3222
3225
  constr = self.with_new_typing(child_typing)
3223
3226
 
3224
- constr.try_special_method(
3227
+ call, constr = constr.try_special_method(
3225
3228
  node,
3226
3229
  receiver_type: receiver_type,
3227
3230
  method_name: method_name,
@@ -3239,30 +3242,32 @@ module Steep
3239
3242
  block_body: block_body,
3240
3243
  tapp: tapp
3241
3244
  )
3245
+
3246
+ if call.is_a?(TypeInference::MethodCall::Typed)
3247
+ constr.typing.save!
3248
+ return [
3249
+ call,
3250
+ update_type_env { constr.context.type_env }
3251
+ ]
3252
+ else
3253
+ fails << [call, constr]
3254
+ end
3242
3255
  end
3243
3256
  end
3244
3257
  end
3245
3258
 
3246
- case
3247
- when results.one?
3248
- # There is only one overload, use the type checking result
3249
- call, constr = results[0]
3250
- when (call, constr = results.find {|call, _| call.is_a?(TypeInference::MethodCall::Typed) })
3251
- # Successfully type checked with one of the overloads
3252
- else
3253
- # No suitable overload, more than one overlodas
3254
- return
3255
- end
3256
-
3257
- constr or raise
3258
- call or raise
3259
+ if fails.one?
3260
+ call, constr = fails[0]
3259
3261
 
3260
- constr.typing.save!
3262
+ constr.typing.save!
3261
3263
 
3262
- [
3263
- call,
3264
- update_type_env { constr.context.type_env }
3265
- ]
3264
+ [
3265
+ call,
3266
+ update_type_env { constr.context.type_env }
3267
+ ]
3268
+ else
3269
+ nil
3270
+ end
3266
3271
  end
3267
3272
 
3268
3273
  def inspect
@@ -390,14 +390,14 @@ module Steep
390
390
  # 4. none of the above (example: T = String, K = Integer)
391
391
 
392
392
  relation = Subtyping::Relation.new(sub_type: type, super_type: instance_type)
393
- if subtyping.check(relation, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.new, instance_type: AST::Types::Instance.new, class_type: AST::Types::Class.new).success?
393
+ if subtyping.check(relation, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.instance, instance_type: AST::Types::Instance.instance, class_type: AST::Types::Class.instance).success?
394
394
  # 1 or 2. Satisfies the condition, no narrowing because `type` is already more specific than/equals to `instance_type`
395
395
  [
396
396
  [type],
397
397
  []
398
398
  ]
399
399
  else
400
- if subtyping.check(relation.flip, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.new, instance_type: AST::Types::Instance.new, class_type: AST::Types::Class.new).success?
400
+ if subtyping.check(relation.flip, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.instance, instance_type: AST::Types::Instance.instance, class_type: AST::Types::Class.instance).success?
401
401
  # 3. Satisfied the condition, narrows to `instance_type`, but cannot remove it from *falsy* list
402
402
  [
403
403
  [instance_type],
data/lib/steep/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "1.3.0.pre.1"
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/steep.rb CHANGED
@@ -93,7 +93,6 @@ require "steep/type_inference/type_env_builder"
93
93
  require "steep/type_inference/logic_type_interpreter"
94
94
  require "steep/type_inference/multiple_assignment"
95
95
  require "steep/type_inference/method_call"
96
- require "steep/ast/types"
97
96
 
98
97
  require "steep/index/rbs_index"
99
98
  require "steep/index/signature_symbol_provider"
@@ -11,7 +11,7 @@ gems:
11
11
  source:
12
12
  type: stdlib
13
13
  - name: rbs
14
- version: 2.8.0.pre.1
14
+ version: 2.8.0
15
15
  source:
16
16
  type: rubygems
17
17
  - name: dbm
@@ -59,7 +59,7 @@ module Steep
59
59
 
60
60
  def self.top_type: () -> Types::Top
61
61
 
62
- def self.optional: (Types::t `type`) -> Types::Union
62
+ def self.optional: (Types::t) -> Types::t
63
63
 
64
64
  def self.true_type: () -> Types::Literal
65
65
 
@@ -6,23 +6,23 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def ==: (untyped other) -> untyped
9
+ def ==: (untyped other) -> bool
10
10
 
11
- def hash: () -> untyped
11
+ def hash: () -> Integer
12
12
 
13
13
  alias eql? ==
14
14
 
15
- def subst: (untyped s) -> self
15
+ def subst: (Interface::Substitution s) -> Any
16
16
 
17
- def to_s: () -> "untyped"
17
+ def to_s: () -> String
18
18
 
19
19
  include Helper::NoFreeVariables
20
20
 
21
21
  include Helper::NoChild
22
22
 
23
- def level: () -> ::Array[1]
23
+ def level: () -> Array[Integer]
24
24
 
25
- def with_location: (untyped new_location) -> untyped
25
+ def with_location: (untyped new_location) -> Any
26
26
  end
27
27
  end
28
28
  end
@@ -6,25 +6,25 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def ==: (untyped other) -> untyped
9
+ def ==: (untyped other) -> bool
10
10
 
11
- def hash: () -> untyped
11
+ def hash: () -> Integer
12
12
 
13
13
  alias eql? ==
14
14
 
15
- def subst: (untyped s) -> self
15
+ def subst: (Interface::Substitution) -> Boolean
16
16
 
17
- def to_s: () -> "bool"
17
+ def to_s: () -> String
18
18
 
19
19
  include Helper::NoFreeVariables
20
20
 
21
21
  include Helper::NoChild
22
22
 
23
- def level: () -> ::Array[0]
23
+ def level: () -> Array[Integer]
24
24
 
25
- def with_location: (untyped new_location) -> untyped
25
+ def with_location: (untyped new_location) -> Boolean
26
26
 
27
- def back_type: () -> untyped
27
+ def back_type: () -> t
28
28
  end
29
29
  end
30
30
  end
@@ -6,23 +6,23 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def ==: (untyped other) -> untyped
9
+ def ==: (untyped other) -> bool
10
10
 
11
- def hash: () -> untyped
11
+ def hash: () -> Integer
12
12
 
13
13
  alias eql? ==
14
14
 
15
- def subst: (untyped s) -> self
15
+ def subst: (Interface::Substitution) -> Bot
16
16
 
17
- def to_s: () -> "bot"
17
+ def to_s: () -> String
18
18
 
19
19
  include Helper::NoFreeVariables
20
20
 
21
21
  include Helper::NoChild
22
22
 
23
- def level: () -> ::Array[2]
23
+ def level: () -> Array[Integer]
24
24
 
25
- def with_location: (untyped new_location) -> untyped
25
+ def with_location: (untyped new_location) -> Bot
26
26
  end
27
27
  end
28
28
  end
@@ -6,23 +6,24 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def to_s: () -> "class"
9
+ def to_s: () -> String
10
10
 
11
- def ==: (untyped other) -> untyped
11
+ def ==: (untyped other) -> bool
12
12
 
13
- def hash: () -> untyped
13
+ def hash: () -> Integer
14
14
 
15
15
  alias eql? ==
16
16
 
17
- def subst: (untyped s) -> untyped
17
+ def subst: (Interface::Substitution s) -> t
18
18
 
19
- def free_variables: () -> untyped
19
+ @@fvs: Set[variable]
20
+ def free_variables: () -> Set[variable]
20
21
 
21
22
  include Helper::NoChild
22
23
 
23
- def level: () -> ::Array[0]
24
+ def level: () -> Array[Integer]
24
25
 
25
- def with_location: (untyped new_location) -> untyped
26
+ def with_location: (untyped new_location) -> Class
26
27
 
27
28
  self.@instance: Class
28
29
  def self.instance: () -> Class
@@ -3,15 +3,18 @@ module Steep
3
3
  module Types
4
4
  module Helper
5
5
  module ChildrenLevel
6
- def level_of_children: (untyped children) -> untyped
6
+ def level_of_children: (Array[t] children) -> Array[Integer]
7
7
  end
8
8
 
9
9
  module NoFreeVariables
10
- def free_variables: () -> untyped
10
+ @fvs: Set[variable]
11
+
12
+ def free_variables: () -> Set[variable]
11
13
  end
12
14
 
13
15
  module NoChild
14
- def each_child: () ?{ () -> untyped } -> (untyped | nil)
16
+ def each_child: () { (t) -> void } -> void
17
+ | () -> Enumerator[t, void]
15
18
  end
16
19
  end
17
20
  end
@@ -6,21 +6,22 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def ==: (untyped other) -> untyped
9
+ def ==: (untyped other) -> bool
10
10
 
11
- def hash: () -> untyped
11
+ def hash: () -> Integer
12
12
 
13
13
  alias eql? ==
14
14
 
15
- def subst: (untyped s) -> untyped
15
+ def subst: (Interface::Substitution s) -> t
16
16
 
17
- def free_variables: () -> untyped
17
+ @@fvs: Set[variable]
18
+ def free_variables: () -> Set[variable]
18
19
 
19
20
  include Helper::NoChild
20
21
 
21
- def to_s: () -> "instance"
22
+ def to_s: () -> String
22
23
 
23
- def level: () -> ::Array[0]
24
+ def level: () -> Array[Integer]
24
25
 
25
26
  def with_location: (untyped new_location) -> untyped
26
27
 
@@ -2,33 +2,36 @@ module Steep
2
2
  module AST
3
3
  module Types
4
4
  class Intersection
5
- attr_reader types: untyped
5
+ attr_reader types: Array[t]
6
6
 
7
7
  attr_reader location: untyped
8
8
 
9
- def initialize: (types: untyped, ?location: untyped?) -> void
9
+ def initialize: (types: Array[t], ?location: untyped?) -> void
10
10
 
11
11
  def self.build: (types: Array[t], ?location: untyped?) -> t
12
12
 
13
- def ==: (untyped other) -> untyped
13
+ def ==: (untyped other) -> bool
14
14
 
15
- def hash: () -> untyped
15
+ @hash: Integer
16
+ def hash: () -> Integer
16
17
 
17
18
  alias eql? ==
18
19
 
19
- def subst: (untyped s) -> untyped
20
+ def subst: (Interface::Substitution s) -> t
20
21
 
21
- def to_s: () -> ::String
22
+ def to_s: () -> String
22
23
 
23
- def free_variables: () -> untyped
24
+ @fvs: Set[variable]
25
+ def free_variables: () -> Set[variable]
24
26
 
25
27
  include Helper::ChildrenLevel
26
28
 
27
- def each_child: () ?{ () -> untyped } -> untyped
29
+ def each_child: () { (t) -> void } -> void
30
+ | () -> Enumerator[t, void]
28
31
 
29
- def level: () -> untyped
32
+ def level: () -> Array[Integer]
30
33
 
31
- def with_location: (untyped new_location) -> untyped
34
+ def with_location: (untyped new_location) -> Intersection
32
35
  end
33
36
  end
34
37
  end
@@ -4,9 +4,11 @@ module Steep
4
4
  class Literal
5
5
  attr_reader location: untyped
6
6
 
7
- attr_reader value: untyped
7
+ type value = Integer | String | Symbol | TrueClass | FalseClass
8
8
 
9
- def initialize: (value: untyped, ?location: untyped?) -> void
9
+ attr_reader value: value
10
+
11
+ def initialize: (value: value, ?location: untyped?) -> void
10
12
 
11
13
  def ==: (untyped other) -> bool
12
14
 
@@ -14,7 +16,7 @@ module Steep
14
16
 
15
17
  alias eql? ==
16
18
 
17
- def subst: (Interface::Substitution s) -> self
19
+ def subst: (Interface::Substitution s) -> Literal
18
20
 
19
21
  def to_s: () -> String
20
22
 
@@ -24,7 +26,7 @@ module Steep
24
26
 
25
27
  def level: () -> Array[Integer]
26
28
 
27
- def with_location: (untyped new_location) -> self
29
+ def with_location: (untyped new_location) -> Literal
28
30
 
29
31
  def back_type: () -> AST::Types::Name::Instance
30
32
  end
@@ -2,24 +2,24 @@ module Steep
2
2
  module AST
3
3
  module Types
4
4
  module Logic
5
- type loc = RBS::Location[untyped, untyped]
6
-
7
5
  class Base
8
6
  attr_reader location: untyped
9
7
 
10
- def subst: (untyped s) -> self
8
+ def subst: (Interface::Substitution s) -> self
11
9
 
12
- def free_variables: () -> untyped
10
+ include Helper::NoFreeVariables
13
11
 
14
12
  include Helper::NoChild
15
13
 
16
- def hash: () -> untyped
14
+ def hash: () -> Integer
17
15
 
18
- def ==: (untyped other) -> untyped
16
+ def ==: (untyped other) -> bool
19
17
 
20
18
  alias eql? ==
21
19
 
22
- def to_s: () -> ::String
20
+ def to_s: () -> String
21
+
22
+ def level: () -> Array[Integer]
23
23
  end
24
24
 
25
25
  # A type for `!` (not) operator results.
@@ -60,7 +60,7 @@ module Steep
60
60
 
61
61
  attr_reader type: t
62
62
 
63
- def initialize: (truthy: TypeInference::TypeEnv, falsy: TypeInference::TypeEnv, type: t, ?location: loc?) -> void
63
+ def initialize: (truthy: TypeInference::TypeEnv, falsy: TypeInference::TypeEnv, type: t, ?location: untyped) -> void
64
64
 
65
65
  def ==: (untyped other) -> bool
66
66
 
@@ -68,7 +68,7 @@ module Steep
68
68
 
69
69
  def hash: () -> Integer
70
70
 
71
- def inspect: () -> ::String
71
+ def inspect: () -> String
72
72
 
73
73
  alias to_s inspect
74
74
  end
@@ -1,6 +1,8 @@
1
1
  module Steep
2
2
  module AST
3
3
  module Types
4
+ # Types with names
5
+ #
4
6
  module Name
5
7
  class Base
6
8
  attr_reader location: untyped
@@ -13,7 +15,7 @@ module Steep
13
15
 
14
16
  def subst: (Steep::Interface::Substitution s) -> self
15
17
 
16
- def level: () -> ::Array[0]
18
+ def level: () -> Array[Integer]
17
19
  end
18
20
 
19
21
  class Applying < Base
@@ -25,22 +27,24 @@ module Steep
25
27
 
26
28
  alias eql? ==
27
29
 
30
+ @hash: Integer
28
31
  def hash: () -> Integer
29
32
 
30
33
  def to_s: () -> ::String
31
34
 
32
- def with_location: (untyped new_location) -> untyped
35
+ def with_location: (untyped new_location) -> self
33
36
 
34
37
  def subst: (Steep::Interface::Substitution s) -> self
35
38
 
36
- def free_variables: () -> Set[Symbol]
39
+ @fvs: Set[variable]
40
+ def free_variables: () -> Set[variable]
37
41
 
38
42
  def each_child: () { (t) -> void } -> void
39
43
  | () -> Enumerator[t, void]
40
44
 
41
45
  include Helper::ChildrenLevel
42
46
 
43
- def level: () -> untyped
47
+ def level: () -> Array[Integer]
44
48
  end
45
49
 
46
50
  class Singleton < Base
@@ -52,7 +56,7 @@ module Steep
52
56
 
53
57
  def to_s: () -> ::String
54
58
 
55
- def with_location: (untyped new_location) -> untyped
59
+ def with_location: (untyped new_location) -> Singleton
56
60
 
57
61
  include Helper::NoChild
58
62
  end
@@ -6,25 +6,25 @@ module Steep
6
6
 
7
7
  def initialize: (?location: untyped?) -> void
8
8
 
9
- def ==: (untyped other) -> untyped
9
+ def ==: (untyped other) -> bool
10
10
 
11
- def hash: () -> untyped
11
+ def hash: () -> Integer
12
12
 
13
13
  alias eql? ==
14
14
 
15
- def subst: (untyped s) -> self
15
+ def subst: (Interface::Substitution s) -> Nil
16
16
 
17
- def to_s: () -> "nil"
17
+ def to_s: () -> String
18
18
 
19
19
  include Helper::NoFreeVariables
20
20
 
21
21
  include Helper::NoChild
22
22
 
23
- def level: () -> ::Array[0]
23
+ def level: () -> Array[Integer]
24
24
 
25
- def with_location: (untyped new_location) -> untyped
25
+ def with_location: (untyped new_location) -> Nil
26
26
 
27
- def back_type: () -> untyped
27
+ def back_type: () -> Name::Instance
28
28
  end
29
29
  end
30
30
  end