steep 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/exe/rbs +1 -1
  4. data/lib/steep/annotation_parser.rb +4 -4
  5. data/lib/steep/ast/buffer.rb +11 -7
  6. data/lib/steep/ast/builtin.rb +8 -0
  7. data/lib/steep/ast/types/factory.rb +55 -55
  8. data/lib/steep/drivers/check.rb +20 -4
  9. data/lib/steep/drivers/langserver.rb +6 -1
  10. data/lib/steep/drivers/vendor.rb +2 -2
  11. data/lib/steep/project/completion_provider.rb +5 -11
  12. data/lib/steep/project/dsl.rb +14 -0
  13. data/lib/steep/project/file.rb +42 -46
  14. data/lib/steep/project/hover_content.rb +11 -5
  15. data/lib/steep/project/options.rb +25 -3
  16. data/lib/steep/project/target.rb +10 -4
  17. data/lib/steep/signature/errors.rb +1 -1
  18. data/lib/steep/signature/validator.rb +8 -8
  19. data/lib/steep/source.rb +1 -1
  20. data/lib/steep/type_construction.rb +987 -711
  21. data/lib/steep/type_inference/constant_env.rb +1 -1
  22. data/lib/steep/type_inference/context.rb +7 -3
  23. data/lib/steep/type_inference/context_array.rb +111 -0
  24. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  25. data/lib/steep/type_inference/logic.rb +130 -0
  26. data/lib/steep/type_inference/type_env.rb +5 -69
  27. data/lib/steep/typing.rb +79 -22
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +6 -1
  30. data/smoke/alias/Steepfile +1 -0
  31. data/smoke/and/Steepfile +1 -0
  32. data/smoke/array/Steepfile +1 -0
  33. data/smoke/array/b.rb +0 -2
  34. data/smoke/block/Steepfile +1 -0
  35. data/smoke/case/Steepfile +1 -0
  36. data/smoke/class/Steepfile +1 -0
  37. data/smoke/const/Steepfile +1 -0
  38. data/smoke/dstr/Steepfile +1 -0
  39. data/smoke/ensure/Steepfile +1 -0
  40. data/smoke/enumerator/Steepfile +1 -0
  41. data/smoke/extension/Steepfile +1 -0
  42. data/smoke/extension/c.rb +1 -0
  43. data/smoke/hash/Steepfile +1 -0
  44. data/smoke/hello/Steepfile +1 -0
  45. data/smoke/if/Steepfile +1 -0
  46. data/smoke/if/a.rb +1 -1
  47. data/smoke/implements/Steepfile +1 -0
  48. data/smoke/initialize/Steepfile +1 -0
  49. data/smoke/integer/Steepfile +1 -0
  50. data/smoke/interface/Steepfile +1 -0
  51. data/smoke/kwbegin/Steepfile +1 -0
  52. data/smoke/lambda/Steepfile +1 -0
  53. data/smoke/literal/Steepfile +1 -0
  54. data/smoke/map/Steepfile +1 -0
  55. data/smoke/method/Steepfile +1 -0
  56. data/smoke/module/Steepfile +1 -0
  57. data/smoke/regexp/Steepfile +1 -0
  58. data/smoke/regression/Steepfile +1 -0
  59. data/smoke/rescue/Steepfile +1 -0
  60. data/smoke/rescue/a.rb +1 -1
  61. data/smoke/self/Steepfile +1 -0
  62. data/smoke/skip/Steepfile +1 -0
  63. data/smoke/stdout/Steepfile +1 -0
  64. data/smoke/super/Steepfile +1 -0
  65. data/smoke/type_case/Steepfile +1 -0
  66. data/smoke/yield/Steepfile +1 -0
  67. data/steep.gemspec +1 -1
  68. data/vendor/ruby-signature/.gitignore +2 -2
  69. data/vendor/ruby-signature/README.md +2 -2
  70. data/vendor/ruby-signature/Rakefile +2 -2
  71. data/vendor/ruby-signature/bin/annotate-with-rdoc +14 -13
  72. data/vendor/ruby-signature/bin/console +1 -1
  73. data/vendor/ruby-signature/bin/sort +7 -6
  74. data/vendor/ruby-signature/bin/test_runner.rb +0 -1
  75. data/vendor/ruby-signature/docs/CONTRIBUTING.md +1 -1
  76. data/vendor/ruby-signature/docs/sigs.md +3 -3
  77. data/vendor/ruby-signature/docs/stdlib.md +1 -1
  78. data/vendor/ruby-signature/docs/syntax.md +9 -9
  79. data/vendor/ruby-signature/exe/rbs +5 -1
  80. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +27 -0
  81. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +27 -0
  82. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +395 -0
  83. data/vendor/ruby-signature/lib/rbs/ast/members.rb +362 -0
  84. data/vendor/ruby-signature/lib/rbs/buffer.rb +50 -0
  85. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +55 -0
  86. data/vendor/ruby-signature/lib/rbs/cli.rb +558 -0
  87. data/vendor/ruby-signature/lib/rbs/constant.rb +26 -0
  88. data/vendor/ruby-signature/lib/rbs/constant_table.rb +150 -0
  89. data/vendor/ruby-signature/lib/rbs/definition.rb +170 -0
  90. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +919 -0
  91. data/vendor/ruby-signature/lib/rbs/environment.rb +281 -0
  92. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +136 -0
  93. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +124 -0
  94. data/vendor/ruby-signature/lib/rbs/errors.rb +187 -0
  95. data/vendor/ruby-signature/lib/rbs/location.rb +102 -0
  96. data/vendor/ruby-signature/lib/rbs/method_type.rb +123 -0
  97. data/vendor/ruby-signature/lib/rbs/namespace.rb +91 -0
  98. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.rb +21 -23
  99. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.y +18 -18
  100. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +553 -0
  101. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +587 -0
  102. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +381 -0
  103. data/vendor/ruby-signature/lib/rbs/substitution.rb +46 -0
  104. data/vendor/ruby-signature/lib/rbs/test/errors.rb +61 -0
  105. data/vendor/ruby-signature/lib/rbs/test/hook.rb +294 -0
  106. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/test/setup.rb +7 -7
  107. data/vendor/ruby-signature/lib/rbs/test/spy.rb +325 -0
  108. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +183 -0
  109. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +254 -0
  110. data/vendor/ruby-signature/lib/rbs/test.rb +26 -0
  111. data/vendor/ruby-signature/lib/rbs/type_name.rb +70 -0
  112. data/vendor/ruby-signature/lib/rbs/types.rb +936 -0
  113. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +138 -0
  114. data/vendor/ruby-signature/lib/rbs/vendorer.rb +47 -0
  115. data/vendor/ruby-signature/lib/rbs/version.rb +3 -0
  116. data/vendor/ruby-signature/lib/rbs/writer.rb +269 -0
  117. data/vendor/ruby-signature/lib/rbs.rb +64 -0
  118. data/vendor/ruby-signature/lib/ruby/signature.rb +4 -61
  119. data/vendor/ruby-signature/{ruby-signature.gemspec → rbs.gemspec} +4 -4
  120. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +58 -1
  121. data/vendor/ruby-signature/stdlib/base64/base64.rbs +69 -13
  122. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +372 -0
  123. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +9 -0
  124. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +1 -7
  125. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +2 -1
  126. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +3 -2
  127. data/vendor/ruby-signature/stdlib/builtin/file.rbs +902 -302
  128. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +190 -68
  129. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +3 -6
  130. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +6 -4
  131. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +146 -120
  132. data/vendor/ruby-signature/stdlib/builtin/math.rbs +310 -7
  133. data/vendor/ruby-signature/stdlib/builtin/method.rbs +11 -8
  134. data/vendor/ruby-signature/stdlib/builtin/module.rbs +959 -103
  135. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +3 -0
  136. data/vendor/ruby-signature/stdlib/builtin/process.rbs +981 -108
  137. data/vendor/ruby-signature/stdlib/builtin/random.rbs +215 -41
  138. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +47 -0
  139. data/vendor/ruby-signature/stdlib/builtin/string.rbs +9 -2
  140. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +282 -11
  141. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +11 -13
  142. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +25 -29
  143. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +1 -1
  144. data/vendor/ruby-signature/stdlib/builtin/time.rbs +875 -567
  145. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +243 -44
  146. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +103 -109
  147. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +62 -0
  148. data/vendor/ruby-signature/stdlib/csv/csv.rbs +773 -0
  149. data/vendor/ruby-signature/stdlib/erb/erb.rbs +375 -1
  150. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -4
  151. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +247 -0
  152. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +1088 -16
  153. data/vendor/ruby-signature/stdlib/set/set.rbs +251 -27
  154. metadata +49 -44
  155. data/exe/ruby-signature +0 -3
  156. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  157. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  158. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  159. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  160. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  161. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  162. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  163. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  164. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  165. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  166. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  167. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  168. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  169. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  170. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  171. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  172. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  173. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  174. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  175. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  176. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  177. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  178. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  179. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  180. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  181. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  182. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  183. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  184. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  185. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  186. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  187. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  188. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  189. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  190. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
@@ -12,7 +12,7 @@ module Steep
12
12
  @cache = {}
13
13
  @factory = factory
14
14
  @context = context
15
- @table = Ruby::Signature::ConstantTable.new(builder: factory.definition_builder)
15
+ @table = RBS::ConstantTable.new(builder: factory.definition_builder)
16
16
  end
17
17
 
18
18
  def namespace
@@ -77,14 +77,16 @@ module Steep
77
77
  attr_reader :module_context
78
78
  attr_reader :self_type
79
79
  attr_reader :type_env
80
+ attr_reader :lvar_env
80
81
 
81
- def initialize(method_context:, block_context:, break_context:, module_context:, self_type:, type_env:)
82
+ def initialize(method_context:, block_context:, break_context:, module_context:, self_type:, type_env:, lvar_env:)
82
83
  @method_context = method_context
83
84
  @block_context = block_context
84
85
  @break_context = break_context
85
86
  @module_context = module_context
86
87
  @self_type = self_type
87
88
  @type_env = type_env
89
+ @lvar_env = lvar_env
88
90
  end
89
91
 
90
92
  def with(method_context: self.method_context,
@@ -92,14 +94,16 @@ module Steep
92
94
  break_context: self.break_context,
93
95
  module_context: self.module_context,
94
96
  self_type: self.self_type,
95
- type_env: self.type_env)
97
+ type_env: self.type_env,
98
+ lvar_env: self.lvar_env)
96
99
  self.class.new(
97
100
  method_context: method_context,
98
101
  block_context: block_context,
99
102
  break_context: break_context,
100
103
  module_context: module_context,
101
104
  self_type: self_type,
102
- type_env: type_env
105
+ type_env: type_env,
106
+ lvar_env: lvar_env
103
107
  )
104
108
  end
105
109
  end
@@ -0,0 +1,111 @@
1
+ module Steep
2
+ module TypeInference
3
+ class ContextArray
4
+ class Entry
5
+ attr_reader :range, :context, :sub_entries
6
+
7
+ def initialize(range:, context:)
8
+ @range = range
9
+ @context = context
10
+ @sub_entries = Set[].compare_by_identity
11
+ end
12
+ end
13
+
14
+ attr_reader :buffer
15
+ attr_reader :root
16
+
17
+ def initialize(buffer:, context:, range: 0..buffer.content.size)
18
+ @buffer = buffer
19
+ @root = Entry.new(range: range, context: context)
20
+ end
21
+
22
+ def range
23
+ root.range
24
+ end
25
+
26
+ def self.from_source(source:, range: nil, context: nil)
27
+ content = if source.node
28
+ source.node.location.expression.source_buffer.source
29
+ else
30
+ ""
31
+ end
32
+ buffer = AST::Buffer.new(name: source.path, content: content)
33
+ new(buffer: buffer, context: context, range: range || 0..buffer.content.size)
34
+ end
35
+
36
+ def insert_context(range, context:, entry: self.root)
37
+ entry.sub_entries.each do |sub|
38
+ next if sub.range.begin < range.begin && range.end <= sub.range.end
39
+ next if range.begin < sub.range.begin && sub.range.end <= range.end
40
+ next if range.end <= sub.range.begin
41
+ next if sub.range.end <= range.begin
42
+
43
+ raise "Range crossing: sub range=#{sub.range}, new range=#{range}"
44
+ end
45
+
46
+ sup = entry.sub_entries.find do |sub|
47
+ sub.range.begin < range.begin && range.end <= sub.range.end
48
+ end
49
+
50
+ if sup
51
+ insert_context(range, context: context, entry: sup)
52
+ else
53
+ subs = entry.sub_entries.select do |sub|
54
+ range.begin < sub.range.begin && sub.range.end <= range.end
55
+ end
56
+
57
+ new_entry = Entry.new(range: range, context: context)
58
+ entry.sub_entries.subtract(subs)
59
+ new_entry.sub_entries.merge(subs)
60
+ entry.sub_entries << new_entry
61
+ end
62
+ end
63
+
64
+ def each_entry
65
+ if block_given?
66
+ es = [root]
67
+
68
+ until es.empty?
69
+ e = es.pop
70
+ es.push(*e.sub_entries.to_a)
71
+
72
+ yield e
73
+ end
74
+ else
75
+ enum_for :each_entry
76
+ end
77
+ end
78
+
79
+ def context_at(index, entry: self.root)
80
+ return nil if index < entry.range.begin || entry.range.end < index
81
+
82
+ sub = entry.sub_entries.find do |sub|
83
+ sub.range.begin <= index && index <= sub.range.end
84
+ end
85
+
86
+ if sub
87
+ context_at(index, entry: sub)
88
+ else
89
+ entry.context
90
+ end
91
+ end
92
+
93
+ def [](index)
94
+ context_at(index)
95
+ end
96
+
97
+ def at(line:, column:)
98
+ pos = buffer.loc_to_pos([line, column])
99
+ self[pos]
100
+ end
101
+
102
+ def merge(subtree)
103
+ subtree.each_entry do |entry|
104
+ if entry.context
105
+ insert_context entry.range, context: entry.context
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,226 @@
1
+ module Steep
2
+ module TypeInference
3
+ class LocalVariableTypeEnv
4
+ attr_reader :subtyping
5
+ attr_reader :self_type
6
+
7
+ class Entry
8
+ attr_reader :type
9
+ attr_reader :annotations
10
+ attr_reader :nodes
11
+
12
+ def initialize(type:, annotations: [], nodes: [])
13
+ @type = type
14
+ @annotations = Set.new(annotations)
15
+ @nodes = Set[].compare_by_identity.merge(nodes)
16
+ end
17
+
18
+ def update(type: self.type, annotations: self.annotations, nodes: self.nodes)
19
+ Entry.new(type: type, annotations: annotations, nodes: nodes)
20
+ end
21
+
22
+ def ==(other)
23
+ other.is_a?(Entry) &&
24
+ other.type == type &&
25
+ other.annotations == annotations &&
26
+ other.nodes == nodes
27
+ end
28
+
29
+ def +(other)
30
+ self.class.new(type: AST::Types::Union.build(types: [type, other.type]),
31
+ annotations: annotations + other.annotations,
32
+ nodes: nodes + other.nodes)
33
+ end
34
+
35
+ def optional
36
+ self.class.new(type: AST::Types::Union.build(types: [type, AST::Builtin.nil_type]),
37
+ annotations: annotations,
38
+ nodes: nodes)
39
+ end
40
+ end
41
+
42
+ attr_reader :declared_types
43
+ attr_reader :assigned_types
44
+
45
+ def self.empty(subtyping:, self_type:)
46
+ new(subtyping: subtyping, declared_types: {}, assigned_types: {}, self_type: self_type)
47
+ end
48
+
49
+ def initialize(subtyping:, declared_types:, assigned_types:, self_type:)
50
+ @subtyping = subtyping
51
+ @self_type = self_type
52
+
53
+ @declared_types = declared_types
54
+ @assigned_types = assigned_types
55
+
56
+ unless (intersection = Set.new(declared_types.keys) & Set.new(assigned_types.keys)).empty?
57
+ raise "Declared types and assigned types should be disjoint: #{intersection}"
58
+ end
59
+ end
60
+
61
+ def update(declared_types: self.declared_types, assigned_types: self.assigned_types, self_type: self.self_type)
62
+ self.class.new(
63
+ subtyping: subtyping,
64
+ declared_types: declared_types,
65
+ assigned_types: assigned_types,
66
+ self_type: self_type
67
+ )
68
+ end
69
+
70
+ def assign!(var, node:, type:)
71
+ declared_type = declared_types[var]&.type
72
+
73
+ if declared_type
74
+ relation = Subtyping::Relation.new(sub_type: type, super_type: declared_type)
75
+ constraints = Subtyping::Constraints.new(unknowns: Set.new)
76
+ subtyping.check(relation, constraints: constraints, self_type: self_type).else do |result|
77
+ yield declared_type, type, result
78
+ end
79
+ end
80
+
81
+ assignments = { var => Entry.new(type: type, nodes: [node]) }
82
+ update(assigned_types: assigned_types.merge(assignments),
83
+ declared_types: declared_types.reject {|k, _| k == var })
84
+ end
85
+
86
+ def assign(var, node:, type:)
87
+ declared_type = declared_types[var]&.type
88
+
89
+ if declared_type
90
+ relation = Subtyping::Relation.new(sub_type: type, super_type: declared_type)
91
+ constraints = Subtyping::Constraints.new(unknowns: Set.new)
92
+ subtyping.check(relation, constraints: constraints, self_type: self_type).else do |result|
93
+ yield declared_type, type, result
94
+ end
95
+
96
+ self
97
+ else
98
+ assignments = { var => Entry.new(type: type, nodes: [node]) }
99
+ update(assigned_types: assigned_types.merge(assignments))
100
+ end
101
+ end
102
+
103
+ def annotate(collection)
104
+ decls = collection.var_type_annotations.each.with_object({}) do |(var, annotation), hash|
105
+ type = collection.var_type(lvar: var)
106
+ hash[var] = Entry.new(type: type, annotations: [annotation])
107
+ end
108
+
109
+ decls.each do |var, annot|
110
+ inner_type = annot.type
111
+ outer_type = self[var]
112
+
113
+ if outer_type
114
+ relation = Subtyping::Relation.new(sub_type: inner_type, super_type: outer_type)
115
+ constraints = Subtyping::Constraints.new(unknowns: Set.new)
116
+ subtyping.check(relation, constraints: constraints, self_type: self_type).else do |result|
117
+ yield var, outer_type, inner_type, result
118
+ end
119
+ end
120
+ end
121
+
122
+ new_decls = declared_types.merge(decls)
123
+ new_assigns = assigned_types.reject {|var, _| new_decls.key?(var) }
124
+
125
+ update(declared_types: new_decls, assigned_types: new_assigns)
126
+ end
127
+
128
+ def [](var)
129
+ entry(var)&.type
130
+ end
131
+
132
+ def entry(var)
133
+ declared_types[var] || assigned_types[var]
134
+ end
135
+
136
+ def pin_assignments
137
+ update(
138
+ declared_types: assigned_types.merge(declared_types),
139
+ assigned_types: {}
140
+ )
141
+ end
142
+
143
+ def except(variables)
144
+ update(
145
+ declared_types: declared_types.reject {|var, _| variables.include?(var) },
146
+ assigned_types: assigned_types.reject {|var, _| variables.include?(var) }
147
+ )
148
+ end
149
+
150
+ def each
151
+ if block_given?
152
+ vars.each do |var|
153
+ yield var, self[var]
154
+ end
155
+ else
156
+ enum_for :each
157
+ end
158
+ end
159
+
160
+ def vars
161
+ @vars ||= Set.new(declared_types.keys + assigned_types.keys)
162
+ end
163
+
164
+ def join(*envs)
165
+ if envs.empty?
166
+ self
167
+ else
168
+ env = envs.inject do |env1, env2|
169
+ assigned_types = {}
170
+ declared_types = {}
171
+
172
+ (env1.vars + env2.vars).each do |var|
173
+ e1 = env1.entry(var)
174
+ e2 = env2.entry(var)
175
+ je = join_entry(e1, e2)
176
+
177
+ if env1.declared_types.key?(var) || env2.declared_types.key?(var)
178
+ declared_types[var] = je
179
+ else
180
+ assigned_types[var] = je
181
+ end
182
+ end
183
+
184
+ LocalVariableTypeEnv.new(
185
+ subtyping: subtyping,
186
+ self_type: self_type,
187
+ declared_types: declared_types,
188
+ assigned_types: assigned_types
189
+ )
190
+ end
191
+
192
+ decls = env.declared_types.merge(declared_types)
193
+ assignments = env.assigned_types.reject {|var, _| decls.key?(var) }
194
+
195
+ update(
196
+ declared_types: decls,
197
+ assigned_types: assignments,
198
+ )
199
+ end
200
+ end
201
+
202
+ def join_entry(e1, e2)
203
+ case
204
+ when e1 && e2
205
+ e1 + e2
206
+ when e1
207
+ e1.optional
208
+ when e2
209
+ e2.optional
210
+ else
211
+ raise
212
+ end
213
+ end
214
+
215
+ def to_s
216
+ ss = []
217
+
218
+ vars.each do |var|
219
+ ss << "#{var}: #{self[var].to_s}"
220
+ end
221
+
222
+ "{#{ss.join(", ")}}"
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,130 @@
1
+ module Steep
2
+ module TypeInference
3
+ class Logic
4
+ class Result
5
+ attr_reader :nodes
6
+
7
+ def initialize(nodes = [])
8
+ @nodes = Set[].compare_by_identity.merge(nodes)
9
+ end
10
+
11
+ def +(other)
12
+ Result.new(nodes + other.nodes)
13
+ end
14
+
15
+ def merge(nodes)
16
+ Result.new(self.nodes + nodes)
17
+ end
18
+
19
+ def vars
20
+ vars = Set[]
21
+
22
+ nodes.each do |node|
23
+ case node.type
24
+ when :lvar, :lvasgn
25
+ vars << node.children[0].name
26
+ end
27
+ end
28
+
29
+ vars
30
+ end
31
+ end
32
+
33
+ attr_reader :subtyping
34
+
35
+ def initialize(subtyping:)
36
+ @subtyping = subtyping
37
+ end
38
+
39
+ def nodes(node:)
40
+ case node.type
41
+ when :lvasgn
42
+ rhs = node.children[1]
43
+ t, f = nodes(node: rhs)
44
+
45
+ [
46
+ t.merge([node]),
47
+ f.merge([node])
48
+ ]
49
+
50
+ when :and
51
+ lhs, rhs = node.children
52
+
53
+ lt, _ = nodes(node: lhs)
54
+ rt, _ = nodes(node: rhs)
55
+
56
+ [
57
+ Result.new([node]) + lt + rt,
58
+ Result.new([node])
59
+ ]
60
+
61
+ when :or
62
+ lhs, rhs = node.children
63
+
64
+ _, lf = nodes(node: lhs)
65
+ _, rf = nodes(node: rhs)
66
+
67
+ [
68
+ Result.new([node]),
69
+ Result.new([node]) + lf + rf
70
+ ]
71
+
72
+ when :begin
73
+ nodes(node: node.children.last)
74
+
75
+ else
76
+ [
77
+ Result.new([node]),
78
+ Result.new([node])
79
+ ]
80
+ end
81
+ end
82
+
83
+ def environments(truthy_vars:, falsey_vars:, lvar_env:)
84
+ truthy_hash = lvar_env.assigned_types.dup
85
+ falsey_hash = lvar_env.assigned_types.dup
86
+
87
+ (truthy_vars + falsey_vars).each do |var|
88
+ type = lvar_env[var]
89
+ truthy_type, falsey_type = partition_union(type)
90
+
91
+ if truthy_vars.include?(var)
92
+ truthy_hash[var] = LocalVariableTypeEnv::Entry.new(type: truthy_type)
93
+ end
94
+
95
+ if falsey_vars.include?(var)
96
+ falsey_hash[var] = LocalVariableTypeEnv::Entry.new(type: falsey_type)
97
+ end
98
+ end
99
+
100
+ [
101
+ lvar_env.except(truthy_vars).update(assigned_types: truthy_hash),
102
+ lvar_env.except(falsey_vars).update(assigned_types: falsey_hash)
103
+ ]
104
+ end
105
+
106
+ def partition_union(type)
107
+ case type
108
+ when AST::Types::Union
109
+ falsey_types, truthy_types = type.types.partition do |type|
110
+ case type
111
+ when AST::Types::Nil
112
+ true
113
+ when AST::Types::Literal
114
+ type.value == false
115
+ end
116
+ end
117
+
118
+ [
119
+ truthy_types.empty? ? AST::Types::Bot.new : AST::Types::Union.build(types: truthy_types),
120
+ falsey_types.empty? ? AST::Types::Bot.new : AST::Types::Union.build(types: falsey_types)
121
+ ]
122
+ when AST::Types::Any, AST::Types::Top, AST::Types::Boolean, AST::Types::Void
123
+ [type, type]
124
+ else
125
+ [type, AST::Types::Bot.new]
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -2,7 +2,6 @@ module Steep
2
2
  module TypeInference
3
3
  class TypeEnv
4
4
  attr_reader :subtyping
5
- attr_reader :lvar_types
6
5
  attr_reader :const_types
7
6
  attr_reader :gvar_types
8
7
  attr_reader :ivar_types
@@ -10,7 +9,6 @@ module Steep
10
9
 
11
10
  def initialize(subtyping:, const_env:)
12
11
  @subtyping = subtyping
13
- @lvar_types = {}
14
12
  @const_types = {}
15
13
  @gvar_types = {}
16
14
  @ivar_types = {}
@@ -19,7 +17,6 @@ module Steep
19
17
 
20
18
  def initialize_copy(other)
21
19
  @subtyping = other.subtyping
22
- @lvar_types = other.lvar_types.dup
23
20
  @const_types = other.const_types.dup
24
21
  @gvar_types = other.gvar_types.dup
25
22
  @ivar_types = other.ivar_types.dup
@@ -28,9 +25,6 @@ module Steep
28
25
 
29
26
  def self.build(annotations:, signatures:, subtyping:, const_env:)
30
27
  new(subtyping: subtyping, const_env: const_env).tap do |env|
31
- annotations.lvar_types.each do |name, type|
32
- env.set(lvar: name, type: type)
33
- end
34
28
  annotations.ivar_types.each do |name, type|
35
29
  env.set(ivar: name, type: type)
36
30
  end
@@ -38,15 +32,14 @@ module Steep
38
32
  env.set(const: name, type: type)
39
33
  end
40
34
  signatures.name_to_global.each do |name, global|
41
- type = signatures.absolute_type(global.type, namespace: Ruby::Signature::Namespace.root) {|ty| ty.name.absolute! }
35
+ type = signatures.absolute_type(global.type, namespace: RBS::Namespace.root) {|ty| ty.name.absolute! }
42
36
  env.set(gvar: name, type: subtyping.factory.type(type))
43
37
  end
44
38
  end
45
39
  end
46
40
 
47
- def with_annotations(lvar_types: {}, ivar_types: {}, const_types: {}, gvar_types: {}, self_type:, &block)
41
+ def with_annotations(ivar_types: {}, const_types: {}, gvar_types: {}, self_type:, &block)
48
42
  dup.tap do |env|
49
- merge!(original_env: env.lvar_types, override_env: lvar_types, self_type: self_type, &block)
50
43
  merge!(original_env: env.ivar_types, override_env: ivar_types, self_type: self_type, &block)
51
44
  merge!(original_env: env.gvar_types, override_env: gvar_types, self_type: self_type, &block)
52
45
 
@@ -64,44 +57,11 @@ module Steep
64
57
  end
65
58
  end
66
59
 
67
- def join!(envs)
68
- lvars = {}
69
-
70
- common_vars = envs.map {|env| Set.new(env.lvar_types.keys) }.inject {|a, b| a & b }
71
-
72
- envs.each do |env|
73
- env.lvar_types.each do |name, type|
74
- unless lvar_types.key?(name)
75
- lvars[name] = [] unless lvars[name]
76
- lvars[name] << type
77
- end
78
- end
79
- end
80
-
81
- lvars.each do |name, types|
82
- if lvar_types.key?(name) || common_vars.member?(name)
83
- set(lvar: name, type: AST::Types::Union.build(types: types))
84
- else
85
- set(lvar: name, type: AST::Types::Union.build(types: types + [AST::Types::Nil.new]))
86
- end
87
- end
88
- end
89
-
90
60
  # @type method assert: (const: Names::Module) { () -> void } -> AST::Type
91
61
  # | (gvar: Symbol) { () -> void } -> AST::Type
92
62
  # | (ivar: Symbol) { () -> void } -> AST::Type
93
- # | (lvar: Symbol) { () -> AST::Type | nil } -> AST::Type
94
- def get(lvar: nil, const: nil, gvar: nil, ivar: nil)
63
+ def get(const: nil, gvar: nil, ivar: nil)
95
64
  case
96
- when lvar
97
- lvar_name(lvar).yield_self do |name|
98
- if lvar_types.key?(name)
99
- lvar_types[name]
100
- else
101
- ty = yield
102
- lvar_types[name] = ty || AST::Types::Any.new
103
- end
104
- end
105
65
  when const
106
66
  if const_types.key?(const)
107
67
  const_types[const]
@@ -127,12 +87,8 @@ module Steep
127
87
  end
128
88
  end
129
89
 
130
- def set(lvar: nil, const: nil, gvar: nil, ivar: nil, type:)
90
+ def set(const: nil, gvar: nil, ivar: nil, type:)
131
91
  case
132
- when lvar
133
- lvar_name(lvar).yield_self do |name|
134
- lvar_types[name] = type
135
- end
136
92
  when const
137
93
  const_types[const] = type
138
94
  else
@@ -145,19 +101,8 @@ module Steep
145
101
  # @type method assign: (const: Names::Module, type: AST::Type) { (Subtyping::Result::Failure | nil) -> void } -> AST::Type
146
102
  # | (gvar: Symbol, type: AST::Type) { (Subtyping::Result::Failure | nil) -> void } -> AST::Type
147
103
  # | (ivar: Symbol, type: AST::Type) { (Subtyping::Result::Failure | nil) -> void } -> AST::Type
148
- # | (lvar: Symbol | LabeledName, type: AST::Type) { (Subtyping::Result::Failure) -> void } -> AST::Type
149
- def assign(lvar: nil, const: nil, gvar: nil, ivar: nil, type:, self_type:, &block)
104
+ def assign(const: nil, gvar: nil, ivar: nil, type:, self_type:, &block)
150
105
  case
151
- when lvar
152
- yield_self do
153
- name = lvar_name(lvar)
154
- var_type = lvar_types[name]
155
- if var_type
156
- assert_assign(var_type: var_type, lhs_type: type, self_type: self_type, &block)
157
- else
158
- lvar_types[name] = type
159
- end
160
- end
161
106
  when const
162
107
  yield_self do
163
108
  const_type = const_types[const] || const_env.lookup(const)
@@ -189,15 +134,6 @@ module Steep
189
134
  end
190
135
  end
191
136
 
192
- def lvar_name(lvar)
193
- case lvar
194
- when Symbol
195
- lvar
196
- when ASTUtils::Labeling::LabeledName
197
- lvar.name
198
- end
199
- end
200
-
201
137
  def assert_assign(var_type:, lhs_type:, self_type:)
202
138
  return var_type if var_type == lhs_type
203
139