steep 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c7d4a0ac0c0bbae681b48b3a435baf1e30f67ed36ae86a9cf6e4546d6e30485
4
- data.tar.gz: a22966a8fd94bed71ad1398d2587b7d84cfc8ba157a47da8b7289f2dae51b8d8
3
+ metadata.gz: a2c1abcf64958fd547dbb336a0489d9e310e71bc66d208a67c6328c1ac09e62b
4
+ data.tar.gz: eecd4d437442a85356525c31d10697d73f06fd319930371a7f2710b77f3e86a3
5
5
  SHA512:
6
- metadata.gz: 31b10b5a6ac174dafee25cf2c9baaf725218e7c8e7969437557982dcc9c4c1704f8fb87bdd2a583eb9e538fee06376fe068ba2f8f64a5f18ec55919d3d49f9f4
7
- data.tar.gz: 5f3db5481934cba32b3b45a92b2a9e2dc796507b3b99c2bdcc9c1a991b9ee6982dad1f5824c478abc7a483ba8ad17fab13ac48e6e13429daf465f3c025e66a40
6
+ metadata.gz: 57957103491d678aa843f9155a757d9f903968d272e2d117b659bcb46659ada397cf82db1bf4e54e25f77a5548db32b6ea2da7be0fba6920d033340c44448c19
7
+ data.tar.gz: 94eeb79af2e1fdab28b5f2c6237e343d9f174d7ff5a65c9d25d3860e042820027c1f4fab8c6571492967c74b37161572b8ab1dea91d8d60d0e7f2c1cbf4c31fe
@@ -14,6 +14,10 @@ jobs:
14
14
  container_tag:
15
15
  - 2.6.5-bionic
16
16
  - 2.7.0-bionic
17
+ task:
18
+ - test
19
+ - smoke
20
+ - build
17
21
  container:
18
22
  image: rubylang/ruby:${{ matrix.container_tag }}
19
23
  steps:
@@ -24,4 +28,4 @@ jobs:
24
28
  gem install bundler
25
29
  bundle install --jobs 4 --retry 3
26
30
  bin/setup
27
- bundle exec rake build test smoke
31
+ bundle exec rake ${{matrix.task}}
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.19.0 (2020-07-12)
6
+
7
+ * Update RBS. ([#157](https://github.com/soutaro/steep/pull/157))
8
+ * No `initialize` in completion. ([#164](https://github.com/soutaro/steep/pull/164))
9
+ * Granular typing option setup. ([#163](https://github.com/soutaro/steep/pull/163))
10
+
5
11
  ## 0.18.0 (2020-07-06)
6
12
 
7
13
  * Sort result of `Pathname#glob` ([#154](https://github.com/soutaro/steep/pull/154))
@@ -8,6 +8,10 @@ module Steep
8
8
  @definition_builder = builder
9
9
  end
10
10
 
11
+ def type_name_resolver
12
+ @type_name_resolver ||= RBS::TypeNameResolver.from_env(definition_builder.env)
13
+ end
14
+
11
15
  def type(type)
12
16
  case type
13
17
  when RBS::Types::Bases::Any
@@ -277,8 +281,7 @@ module Steep
277
281
 
278
282
  def unfold(type_name)
279
283
  type_name_1(type_name).yield_self do |type_name|
280
- decl = definition_builder.env.find_alias(type_name) or raise "Unknown type name: #{type_name}"
281
- type(definition_builder.env.absolute_type(decl.type, namespace: type_name.namespace))
284
+ type(definition_builder.expand_alias(type_name))
282
285
  end
283
286
  end
284
287
 
@@ -331,7 +334,7 @@ module Steep
331
334
  method.method_types.map do |type|
332
335
  method_type(type, self_type: self_type) {|ty| ty.subst(subst) }
333
336
  end,
334
- incompatible: method.attributes.include?(:incompatible)
337
+ incompatible: name == :initialize || name == :new
335
338
  )
336
339
  end
337
340
  end
@@ -339,8 +342,7 @@ module Steep
339
342
  when Name::Interface
340
343
  Interface::Interface.new(type: self_type, private: private).tap do |interface|
341
344
  type_name = type_name_1(type.name)
342
- decl = definition_builder.env.find_class(type_name) or raise "Unknown class: #{type_name}"
343
- definition = definition_builder.build_interface(type_name, decl)
345
+ definition = definition_builder.build_interface(type_name)
344
346
 
345
347
  subst = Interface::Substitution.build(
346
348
  definition.type_params,
@@ -363,7 +365,7 @@ module Steep
363
365
  definition = definition_builder.build_singleton(type_name_1(type.name))
364
366
 
365
367
  instance_type = Name::Instance.new(name: type.name,
366
- args: definition.declaration.type_params.each.map {Any.new(location: nil)},
368
+ args: definition.type_params.map {Any.new(location: nil)},
367
369
  location: nil)
368
370
  subst = Interface::Substitution.build(
369
371
  [],
@@ -543,12 +545,12 @@ module Steep
543
545
 
544
546
  def module_name?(type_name)
545
547
  name = type_name_1(type_name)
546
- env.class?(name) && env.find_class(name).is_a?(RBS::AST::Declarations::Module)
548
+ entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ModuleEntry)
547
549
  end
548
550
 
549
551
  def class_name?(type_name)
550
552
  name = type_name_1(type_name)
551
- env.class?(name) && env.find_class(name).is_a?(RBS::AST::Declarations::Class)
553
+ entry = env.class_decls[name] and entry.is_a?(RBS::Environment::ClassEntry)
552
554
  end
553
555
 
554
556
  def env
@@ -556,13 +558,14 @@ module Steep
556
558
  end
557
559
 
558
560
  def absolute_type(type, namespace:)
559
- type(env.absolute_type(type_1(type),
560
- namespace: namespace_1(namespace)) {|type| type.name.absolute! })
561
+ absolute_type = type_1(type).map_type_name do |name|
562
+ absolute_type_name(name, namespace: namespace) || name.absolute!
563
+ end
564
+ type(absolute_type)
561
565
  end
562
566
 
563
567
  def absolute_type_name(type_name, namespace:)
564
- type(env.absolute_type_name(type_name_1(type_name),
565
- namespace: namespace_1(namespace)) {|name| name.absolute! })
568
+ type_name_resolver.resolve(type_name, context: namespace_1(namespace).ascend)
566
569
  end
567
570
  end
568
571
  end
@@ -10,7 +10,15 @@ module Steep
10
10
 
11
11
  InstanceVariableItem = Struct.new(:identifier, :range, :type, keyword_init: true)
12
12
  LocalVariableItem = Struct.new(:identifier, :range, :type, keyword_init: true)
13
- MethodNameItem = Struct.new(:identifier, :range, :definition, :method_type, :inherited_method, keyword_init: true)
13
+ MethodNameItem = Struct.new(:identifier, :range, :definition, :def_type, :inherited_method, keyword_init: true) do
14
+ def method_type
15
+ def_type.type
16
+ end
17
+
18
+ def comment
19
+ def_type.comment
20
+ end
21
+ end
14
22
 
15
23
  attr_reader :source_text
16
24
  attr_reader :path
@@ -231,21 +239,22 @@ module Steep
231
239
  subtyping.factory.definition_builder.build_singleton(type_name)
232
240
  when AST::Types::Name::Interface
233
241
  type_name = subtyping.factory.type_name_1(type.name)
234
- interface = subtyping.factory.env.find_class(type_name)
235
- subtyping.factory.definition_builder.build_interface(type_name, interface)
242
+ subtyping.factory.definition_builder.build_interface(type_name)
236
243
  end
237
244
 
238
245
  if definition
239
246
  definition.methods.each do |name, method|
247
+ next if disallowed_method?(name)
248
+
240
249
  if include_private || method.public?
241
250
  if name.to_s.start_with?(prefix)
242
251
  if word_name?(name.to_s)
243
- method.method_types.each do |method_type|
252
+ method.defs.each do |def_type|
244
253
  items << MethodNameItem.new(identifier: name,
245
254
  range: range,
246
255
  definition: method,
247
- method_type: method_type,
248
- inherited_method: inherited_method?(method, type))
256
+ def_type: def_type,
257
+ inherited_method: inherited_method?(method, definition))
249
258
  end
250
259
  end
251
260
  end
@@ -295,8 +304,15 @@ module Steep
295
304
  index
296
305
  end
297
306
 
298
- def inherited_method?(method, type)
299
- method.implemented_in&.name&.name != type.name&.name
307
+ def inherited_method?(method, definition)
308
+ method.implemented_in != definition.type_name
309
+ end
310
+
311
+ def disallowed_method?(name)
312
+ # initialize isn't invoked by developers when creating
313
+ # instances of new classes, so don't show it as
314
+ # an LSP option
315
+ name == :initialize
300
316
  end
301
317
  end
302
318
  end
@@ -10,6 +10,7 @@ module Steep
10
10
  attr_reader :no_builtin
11
11
  attr_reader :vendor_dir
12
12
  attr_reader :strictness_level
13
+ attr_reader :typing_option_hash
13
14
 
14
15
  def initialize(name, sources: [], libraries: [], signatures: [], ignored_sources: [])
15
16
  @name = name
@@ -19,6 +20,7 @@ module Steep
19
20
  @ignored_sources = ignored_sources
20
21
  @vendor_dir = nil
21
22
  @strictness_level = :default
23
+ @typing_option_hash = {}
22
24
  end
23
25
 
24
26
  def initialize_copy(other)
@@ -29,6 +31,7 @@ module Steep
29
31
  @ignored_sources = other.ignored_sources.dup
30
32
  @vendor_dir = other.vendor_dir
31
33
  @strictness_level = other.strictness_level
34
+ @typing_option_hash = other.typing_option_hash
32
35
  end
33
36
 
34
37
  def check(*args)
@@ -43,8 +46,9 @@ module Steep
43
46
  libraries.push(*args)
44
47
  end
45
48
 
46
- def typing_options(level)
49
+ def typing_options(level = @strictness_level, **hash)
47
50
  @strictness_level = level
51
+ @typing_option_hash = hash
48
52
  end
49
53
 
50
54
  def signature(*args)
@@ -128,6 +132,8 @@ module Steep
128
132
  options.apply_lenient_typing_options!
129
133
  end
130
134
 
135
+ options.merge!(target.typing_option_hash)
136
+
131
137
  case target.vendor_dir
132
138
  when Array
133
139
  options.vendored_stdlib_path = target.vendor_dir[0]
@@ -95,6 +95,13 @@ module Steep
95
95
  source: source,
96
96
  timestamp: Time.now
97
97
  )
98
+ rescue RBS::NoTypeFoundError,
99
+ RBS::NoMixinFoundError,
100
+ RBS::NoSuperclassFoundError,
101
+ RBS::DuplicatedMethodDefinitionError,
102
+ RBS::InvalidTypeApplicationError => exn
103
+ # Skip logging known signature errors (they are handled with load_signatures(validate: true))
104
+ @status = TypeCheckErrorStatus.new(error: exn)
98
105
  rescue => exn
99
106
  Steep.log_error(exn)
100
107
  @status = TypeCheckErrorStatus.new(error: exn)
@@ -4,7 +4,13 @@ module Steep
4
4
  TypeContent = Struct.new(:node, :type, :location, keyword_init: true)
5
5
  VariableContent = Struct.new(:node, :name, :type, :location, keyword_init: true)
6
6
  MethodCallContent = Struct.new(:node, :method_name, :type, :definition, :location, keyword_init: true)
7
- DefinitionContent = Struct.new(:node, :method_name, :method_type, :definition, :location, keyword_init: true)
7
+ DefinitionContent = Struct.new(:node, :method_name, :method_type, :definition, :location, keyword_init: true) do
8
+ def comment_string
9
+ if comments = definition&.comments
10
+ comments.map {|c| c.string.chomp }.uniq.join("\n----\n")
11
+ end
12
+ end
13
+ end
8
14
 
9
15
  InstanceMethodName = Struct.new(:class_name, :method_name)
10
16
  SingletonMethodName = Struct.new(:class_name, :method_name)
@@ -80,7 +86,7 @@ module Steep
80
86
  when AST::Types::Name::Instance
81
87
  method_definition = method_definition_for(factory, receiver_type.name, instance_method: method_name)
82
88
  if method_definition&.defined_in
83
- owner_name = factory.type_name(method_definition.defined_in.name.absolute!)
89
+ owner_name = factory.type_name(method_definition.defined_in)
84
90
  [
85
91
  InstanceMethodName.new(owner_name, method_name),
86
92
  method_definition
@@ -89,7 +95,7 @@ module Steep
89
95
  when AST::Types::Name::Class
90
96
  method_definition = method_definition_for(factory, receiver_type.name, singleton_method: method_name)
91
97
  if method_definition&.defined_in
92
- owner_name = factory.type_name(method_definition.defined_in.name.absolute!)
98
+ owner_name = factory.type_name(method_definition.defined_in)
93
99
  [
94
100
  SingletonMethodName.new(owner_name, method_name),
95
101
  method_definition
@@ -52,6 +52,13 @@ module Steep
52
52
  true
53
53
  end
54
54
  end
55
+
56
+ def merge!(hash)
57
+ self.allow_fallback_any = hash[:allow_fallback_any] if hash.key?(:allow_fallback_any)
58
+ self.allow_missing_definitions = hash[:allow_missing_definitions] if hash.key?(:allow_missing_definitions)
59
+ self.allow_unknown_constant_assignment = hash[:allow_unknown_constant_assignment] if hash.key?(:allow_unknown_constant_assignment)
60
+ self.allow_unknown_method_calls = hash[:allow_unknown_method_calls] if hash.key?(:allow_unknown_method_calls)
61
+ end
55
62
  end
56
63
  end
57
64
  end
@@ -15,6 +15,7 @@ module Steep
15
15
 
16
16
  SignatureSyntaxErrorStatus = Struct.new(:timestamp, :errors, keyword_init: true)
17
17
  SignatureValidationErrorStatus = Struct.new(:timestamp, :errors, keyword_init: true)
18
+ SignatureOtherErrorStatus = Struct.new(:timestamp, :error, keyword_init: true)
18
19
  TypeCheckStatus = Struct.new(:environment, :subtyping, :type_check_sources, :timestamp, keyword_init: true)
19
20
 
20
21
  def initialize(name:, options:, source_patterns:, ignore_patterns:, signature_patterns:)
@@ -95,7 +96,7 @@ module Steep
95
96
  end
96
97
 
97
98
  def environment
98
- @environment ||= RBS::Environment.new().tap do |env|
99
+ @environment ||= RBS::Environment.new().yield_self do |env|
99
100
  stdlib_root = options.vendored_stdlib_path || RBS::EnvironmentLoader::STDLIB_ROOT
100
101
  gem_vendor_path = options.vendored_gems_path
101
102
  loader = RBS::EnvironmentLoader.new(stdlib_root: stdlib_root, gem_vendor_path: gem_vendor_path)
@@ -103,6 +104,8 @@ module Steep
103
104
  loader.add(library: lib)
104
105
  end
105
106
  loader.load(env: env)
107
+
108
+ env.resolve_type_names
106
109
  end
107
110
  end
108
111
 
@@ -125,34 +128,40 @@ module Steep
125
128
  if status.is_a?(TypeCheckStatus) && updated_files.empty?
126
129
  yield status.environment, status.subtyping, status.timestamp
127
130
  else
128
- env = environment.dup
129
-
130
- signature_files.each_value do |file|
131
- if file.status.is_a?(SignatureFile::DeclarationsStatus)
132
- file.status.declarations.each do |decl|
133
- env << decl
131
+ begin
132
+ env = environment.dup
133
+
134
+ signature_files.each_value do |file|
135
+ if file.status.is_a?(SignatureFile::DeclarationsStatus)
136
+ file.status.declarations.each do |decl|
137
+ env << decl
138
+ end
134
139
  end
135
140
  end
136
- end
137
141
 
138
- definition_builder = RBS::DefinitionBuilder.new(env: env)
139
- factory = AST::Types::Factory.new(builder: definition_builder)
140
- check = Subtyping::Check.new(factory: factory)
142
+ env = env.resolve_type_names
141
143
 
142
- if validate
143
- validator = Signature::Validator.new(checker: check)
144
- validator.validate()
144
+ definition_builder = RBS::DefinitionBuilder.new(env: env)
145
+ factory = AST::Types::Factory.new(builder: definition_builder)
146
+ check = Subtyping::Check.new(factory: factory)
145
147
 
146
- if validator.no_error?
147
- yield env, check, Time.now
148
+ if validate
149
+ validator = Signature::Validator.new(checker: check)
150
+ validator.validate()
151
+
152
+ if validator.no_error?
153
+ yield env, check, Time.now
154
+ else
155
+ @status = SignatureValidationErrorStatus.new(
156
+ errors: validator.each_error.to_a,
157
+ timestamp: Time.now
158
+ )
159
+ end
148
160
  else
149
- @status = SignatureValidationErrorStatus.new(
150
- errors: validator.each_error.to_a,
151
- timestamp: Time.now
152
- )
161
+ yield env, check, Time.now
153
162
  end
154
- else
155
- yield env, check, Time.now
163
+ rescue => exn
164
+ @status = SignatureOtherErrorStatus.new(error: exn, timestamp: Time.now)
156
165
  end
157
166
  end
158
167
 
@@ -110,7 +110,7 @@ HOVER
110
110
  def #{content.method_name}: #{content.method_type}
111
111
  ```
112
112
  HOVER
113
- if (comment = content.definition.comment)
113
+ if (comment = content.comment_string)
114
114
  string << "\n----\n\n#{comment.string}\n"
115
115
  end
116
116
 
@@ -190,7 +190,7 @@ HOVER
190
190
  new_text: "#{item.identifier}#{method_type_snippet}",
191
191
  range: range
192
192
  ),
193
- documentation: item.definition.comment&.string,
193
+ documentation: item.comment&.string,
194
194
  insert_text_format: LanguageServer::Protocol::Constant::InsertTextFormat::SNIPPET,
195
195
  sort_text: item.inherited_method ? 'z' : 'a' # Ensure language server puts non-inherited methods before inherited methods
196
196
  )
@@ -114,6 +114,7 @@ module Steep
114
114
  end
115
115
  else
116
116
  Steep.logger.info "Unexpected target status: #{status.class}"
117
+ {}
117
118
  end
118
119
 
119
120
  diagnostics.each do |path, diags|
@@ -35,6 +35,14 @@ module Steep
35
35
  checker.factory.definition_builder
36
36
  end
37
37
 
38
+ def type_name_resolver
39
+ @type_name_resolver ||= RBS::TypeNameResolver.from_env(env)
40
+ end
41
+
42
+ def validator
43
+ @validator ||= RBS::Validator.new(env: env, resolver: type_name_resolver)
44
+ end
45
+
38
46
  def factory
39
47
  checker.factory
40
48
  end
@@ -47,57 +55,69 @@ module Steep
47
55
  validate_global
48
56
  end
49
57
 
50
- def validate_one_decl(name, decl)
51
- case decl
52
- when Declarations::Class
53
- rescue_validation_errors do
54
- Steep.logger.debug "#{Location.to_string decl.location}:\tValidating class definition `#{name}`..."
55
- builder.build_instance(decl.name.absolute!).each_type do |type|
56
- env.validate type, namespace: RBS::Namespace.root
58
+ def validate_type(type)
59
+ Steep.logger.debug "#{Location.to_string type.location}: Validating #{type}..."
60
+ validator.validate_type type, context: [RBS::Namespace.root]
61
+ end
62
+
63
+ def validate_one_class(name)
64
+ rescue_validation_errors do
65
+ Steep.logger.debug "Validating class definition `#{name}`..."
66
+ Steep.logger.tagged "#{name}" do
67
+ builder.build_instance(name).each_type do |type|
68
+ validate_type type
57
69
  end
58
- builder.build_singleton(decl.name.absolute!).each_type do |type|
59
- env.validate type, namespace: RBS::Namespace.root
70
+ builder.build_singleton(name).each_type do |type|
71
+ validate_type type
60
72
  end
61
73
  end
62
- when Declarations::Interface
63
- rescue_validation_errors do
64
- Steep.logger.debug "#{Location.to_string decl.location}:\tValidating interface `#{name}`..."
65
- builder.build_interface(decl.name.absolute!, decl).each_type do |type|
66
- env.validate type, namespace: RBS::Namespace.root
74
+ end
75
+ end
76
+
77
+ def validate_one_interface(name)
78
+ rescue_validation_errors do
79
+ Steep.logger.debug "Validating interface `#{name}`..."
80
+ Steep.logger.tagged "#{name}" do
81
+ builder.build_interface(name).each_type do |type|
82
+ validate_type type
67
83
  end
68
84
  end
69
85
  end
70
86
  end
71
87
 
72
88
  def validate_decl
73
- env.each_decl do |name, decl|
74
- validate_one_decl name, decl
89
+ env.class_decls.each_key do |name|
90
+ validate_one_class(name)
91
+ end
92
+
93
+ env.interface_decls.each_key do |name|
94
+ validate_one_interface(name)
75
95
  end
76
96
  end
77
97
 
78
98
  def validate_const
79
- env.each_constant do |name, decl|
99
+ env.constant_decls.each do |name, entry|
80
100
  rescue_validation_errors do
81
- Steep.logger.debug "#{Location.to_string decl.location}:\tValidating constant `#{name}`..."
82
- env.validate(decl.type, namespace: name.namespace)
101
+ Steep.logger.debug "Validating constant `#{name}`..."
102
+ validate_type entry.decl.type
83
103
  end
84
104
  end
85
105
  end
86
106
 
87
107
  def validate_global
88
- env.each_global do |name, decl|
108
+ env.global_decls.each do |name, entry|
89
109
  rescue_validation_errors do
90
- Steep.logger.debug "#{Location.to_string decl.location}:\tValidating global `#{name}`..."
91
- env.validate(decl.type, namespace: RBS::Namespace.root)
110
+ Steep.logger.debug "Validating global `#{name}`..."
111
+ validate_type entry.decl.type
92
112
  end
93
113
  end
94
114
  end
95
115
 
96
116
  def validate_alias
97
- env.each_alias do |name, decl|
117
+ env.alias_decls.each do |name, entry|
98
118
  rescue_validation_errors do
99
- Steep.logger.debug "#{Location.to_string decl.location}:\tValidating alias `#{name}`..."
100
- env.validate(decl.type, namespace: name.namespace)
119
+ Steep.logger.debug "Validating alias `#{name}`..."
120
+ validate_type(entry.decl.type)
101
121
  end
102
122
  end
103
123
  end
@@ -108,10 +128,10 @@ module Steep
108
128
  @errors << Errors::InvalidTypeApplicationError.new(
109
129
  name: factory.type_name(exn.type_name),
110
130
  args: exn.args.map {|ty| factory.type(ty) },
111
- params: exn.params.each.map(&:name),
131
+ params: exn.params,
112
132
  location: exn.location
113
133
  )
114
- rescue RBS::NoTypeFoundError => exn
134
+ rescue RBS::NoTypeFoundError, RBS::NoSuperclassFoundError, RBS::NoMixinFoundError => exn
115
135
  @errors << Errors::UnknownTypeNameError.new(
116
136
  name: factory.type_name(exn.type_name),
117
137
  location: exn.location
@@ -37,7 +37,6 @@ module Steep
37
37
  attr_reader :source
38
38
  attr_reader :annotations
39
39
  attr_reader :typing
40
- attr_reader :type_env
41
40
 
42
41
  attr_reader :context
43
42
 
@@ -169,7 +168,7 @@ module Steep
169
168
 
170
169
  super_method = if definition
171
170
  if (this_method = definition.methods[method_name])
172
- if module_context&.class_name == checker.factory.type_name(this_method.defined_in.name.absolute!)
171
+ if module_context&.class_name == checker.factory.type_name(this_method.defined_in)
173
172
  this_method.super_method
174
173
  else
175
174
  this_method
@@ -256,9 +255,9 @@ module Steep
256
255
  absolute_name(new_module_name).yield_self do |absolute_name|
257
256
  if checker.factory.module_name?(absolute_name)
258
257
  absolute_name_ = checker.factory.type_name_1(absolute_name)
259
- decl = checker.factory.env.find_class(absolute_name_)
258
+ entry = checker.factory.env.class_decls[absolute_name_]
260
259
  AST::Annotation::Implements::Module.new(name: absolute_name,
261
- args: decl.type_params.each.map(&:name))
260
+ args: entry.type_params.each.map(&:name))
262
261
  end
263
262
  end
264
263
  end
@@ -269,7 +268,7 @@ module Steep
269
268
  module_args = implement_module_name.args.map {|x| AST::Types::Var.new(name: x)}
270
269
 
271
270
  type_name_ = checker.factory.type_name_1(implement_module_name.name)
272
- module_decl = checker.factory.definition_builder.env.find_class(type_name_)
271
+ module_entry = checker.factory.definition_builder.env.class_decls[type_name_]
273
272
  instance_def = checker.factory.definition_builder.build_instance(type_name_)
274
273
  module_def = checker.factory.definition_builder.build_singleton(type_name_)
275
274
 
@@ -277,9 +276,22 @@ module Steep
277
276
  types: [
278
277
  AST::Types::Name::Instance.new(name: module_name, args: module_args),
279
278
  AST::Builtin::Object.instance_type,
280
- module_decl.self_type&.yield_self {|ty|
281
- absolute_type = checker.factory.env.absolute_type(ty, namespace: module_decl.name.absolute!.namespace)
282
- checker.factory.type(absolute_type)
279
+ *module_entry.self_types.map {|module_self|
280
+ type = case
281
+ when module_self.name.interface?
282
+ RBS::Types::Interface.new(
283
+ name: module_self.name,
284
+ args: module_self.args,
285
+ location: module_self.location
286
+ )
287
+ when module_self.name.class?
288
+ RBS::Types::ClassInstance.new(
289
+ name: module_self.name,
290
+ args: module_self.args,
291
+ location: module_self.location
292
+ )
293
+ end
294
+ checker.factory.type(type)
283
295
  }
284
296
  ].compact
285
297
  )
@@ -362,9 +374,11 @@ module Steep
362
374
 
363
375
  if name
364
376
  absolute_name_ = checker.factory.type_name_1(name)
365
- decl = checker.factory.env.find_class(absolute_name_)
366
- AST::Annotation::Implements::Module.new(name: name,
367
- args: decl.type_params.each.map(&:name))
377
+ entry = checker.factory.env.class_decls[absolute_name_]
378
+ AST::Annotation::Implements::Module.new(
379
+ name: name,
380
+ args: entry.type_params.each.map(&:name)
381
+ )
368
382
  end
369
383
  end
370
384
  end
@@ -565,6 +579,7 @@ module Steep
565
579
  add_typing(node, type: AST::Builtin.any_type)
566
580
  else
567
581
  rhs_result = synthesize(rhs, hint: hint || context.lvar_env.declared_types[name]&.type)
582
+
568
583
  constr = rhs_result.constr.update_lvar_env do |lvar_env|
569
584
  lvar_env.assign(name, node: node, type: rhs_result.type) do |declared_type, actual_type, result|
570
585
  typing.add_error(Errors::IncompatibleAssignment.new(node: node,
@@ -1992,9 +2007,11 @@ module Steep
1992
2007
  end
1993
2008
  end
1994
2009
  rescue => exn
1995
- $stderr.puts exn.inspect
1996
- exn.backtrace.each do |t|
1997
- $stderr.puts t
2010
+ case exn
2011
+ when RBS::NoTypeFoundError, RBS::NoMixinFoundError, RBS::NoSuperclassFoundError, RBS::InvalidTypeApplicationError
2012
+ # ignore known RBS errors.
2013
+ else
2014
+ Steep.log_error(exn, message: "Unexpected error in #type_send: #{exn.message} (#{exn.class})")
1998
2015
  end
1999
2016
 
2000
2017
  fallback_to_any node do
@@ -2750,13 +2767,18 @@ module Steep
2750
2767
  end
2751
2768
 
2752
2769
  def validate_method_definitions(node, module_name)
2770
+ module_name_1 = checker.factory.type_name_1(module_name.name)
2771
+ member_decl_count = checker.factory.env.class_decls[module_name_1].decls.count {|d| d.decl.each_member.count > 0 }
2772
+
2773
+ return unless member_decl_count == 1
2774
+
2753
2775
  expected_instance_method_names = (module_context.instance_definition&.methods || {}).each.with_object(Set[]) do |(name, method), set|
2754
- if method.implemented_in == module_context.instance_definition.declaration
2776
+ if method.implemented_in == module_context.instance_definition.type_name
2755
2777
  set << name
2756
2778
  end
2757
2779
  end
2758
2780
  expected_module_method_names = (module_context.module_definition&.methods || {}).each.with_object(Set[]) do |(name, method), set|
2759
- if method.implemented_in == module_context.module_definition.declaration
2781
+ if method.implemented_in == module_context.module_definition.type_name
2760
2782
  set << name
2761
2783
  end
2762
2784
  end
@@ -2948,7 +2970,7 @@ module Steep
2948
2970
  def to_instance_type(type, args: nil)
2949
2971
  args = args || case type
2950
2972
  when AST::Types::Name::Class, AST::Types::Name::Module
2951
- checker.factory.env.find_class(checker.factory.type_name_1(type.name)).type_params.each.map { AST::Builtin.any_type }
2973
+ checker.factory.env.class_decls[checker.factory.type_name_1(type.name)].type_params.each.map { AST::Builtin.any_type }
2952
2974
  else
2953
2975
  raise "unexpected type to to_instance_type: #{type}"
2954
2976
  end
@@ -31,8 +31,8 @@ module Steep
31
31
  annotations.const_types.each do |name, type|
32
32
  env.set(const: name, type: type)
33
33
  end
34
- signatures.name_to_global.each do |name, global|
35
- type = signatures.absolute_type(global.type, namespace: RBS::Namespace.root) {|ty| ty.name.absolute! }
34
+ signatures.global_decls.each do |name, entry|
35
+ type = entry.decl.type
36
36
  env.set(gvar: name, type: subtyping.factory.type(type))
37
37
  end
38
38
  end
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "0.18.0"
2
+ VERSION = "0.19.0"
3
3
  end
@@ -1,9 +1,10 @@
1
- extension Object (X)
1
+
2
+ class Object
2
3
  def try: [A] { (instance) -> A } -> A
3
4
  def f: -> Object
4
5
  end
5
6
 
6
- extension Kernel (X)
7
+ module Kernel
7
8
  def new_module_method: () -> void
8
9
  end
9
10
 
@@ -2,7 +2,6 @@ class NumberLike
2
2
  def to_number: -> Integer
3
3
  end
4
4
 
5
- extension Integer (NumberLike)
6
- def `+`: (NumberLike) -> NumberLike
7
- | super
5
+ class Integer
6
+ overload def `+`: (NumberLike) -> NumberLike
8
7
  end
@@ -1,12 +1,12 @@
1
1
  class A
2
2
  def foo: -> _Foo
3
3
  def hello: -> void
4
- end
5
4
 
6
- class A::Object
7
- def object?: -> bool
8
- end
5
+ class Object
6
+ def object?: -> bool
7
+ end
9
8
 
10
- interface A::_Foo
11
- def foo: -> Object
9
+ interface _Foo
10
+ def foo: -> Object
11
+ end
12
12
  end
@@ -41,5 +41,5 @@ Gem::Specification.new do |spec|
41
41
  spec.add_runtime_dependency "rainbow", ">= 2.2.2", "< 4.0"
42
42
  spec.add_runtime_dependency "listen", "~> 3.1"
43
43
  spec.add_runtime_dependency "language_server-protocol", "~> 3.14.0.2"
44
- spec.add_runtime_dependency "rbs", ">= 0.3.1", '< 0.5.0'
44
+ spec.add_runtime_dependency "rbs", ">= 0.6.0", '< 0.7.0'
45
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-06 00:00:00.000000000 Z
11
+ date: 2020-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -190,20 +190,20 @@ dependencies:
190
190
  requirements:
191
191
  - - ">="
192
192
  - !ruby/object:Gem::Version
193
- version: 0.3.1
193
+ version: 0.6.0
194
194
  - - "<"
195
195
  - !ruby/object:Gem::Version
196
- version: 0.5.0
196
+ version: 0.7.0
197
197
  type: :runtime
198
198
  prerelease: false
199
199
  version_requirements: !ruby/object:Gem::Requirement
200
200
  requirements:
201
201
  - - ">="
202
202
  - !ruby/object:Gem::Version
203
- version: 0.3.1
203
+ version: 0.6.0
204
204
  - - "<"
205
205
  - !ruby/object:Gem::Version
206
- version: 0.5.0
206
+ version: 0.7.0
207
207
  description: Gradual Typing for Ruby
208
208
  email:
209
209
  - matsumoto@soutaro.com
@@ -463,7 +463,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
463
463
  - !ruby/object:Gem::Version
464
464
  version: '0'
465
465
  requirements: []
466
- rubygems_version: 3.1.2
466
+ rubygems_version: 3.0.3
467
467
  signing_key:
468
468
  specification_version: 4
469
469
  summary: Gradual Typing for Ruby