Skip to content

Commit 4feab5e

Browse files
authored
Merge pull request #2237 from ksss/validate-variable-type
Validate variable types
2 parents f0e2410 + 4199fa1 commit 4feab5e

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

lib/rbs/cli/validate.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ def validate_class_module_definition
196196
end
197197
InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location)
198198
when AST::Members::Var
199+
@validator.validate_variable(member)
199200
void_type_context_validator(member.type)
200201
if member.is_a?(AST::Members::ClassVariable)
201202
no_self_type_validator(member.type)

lib/rbs/validator.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ def validate_type_params(params, type_name: , method_name: nil, location:)
151151
end
152152
end
153153

154+
def validate_variable(var)
155+
validate_type(var.type, context: nil)
156+
end
157+
154158
def validate_class_alias(entry:)
155159
case env.normalize_module_name?(entry.decl.new_name)
156160
when nil

sig/validator.rbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ module RBS
4949
#
5050
def validate_class_alias: (entry: Environment::ClassAliasEntry | Environment::ModuleAliasEntry) -> void
5151

52+
# Validates instance/class-instance/class variables.
53+
#
54+
def validate_variable: (AST::Members::Var) -> void
55+
5256
private
5357

5458
# Resolves relative type names to absolute type names in given context.

test/validator_test.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,60 @@ def foo: () -> A
391391
end
392392
end
393393
end
394+
395+
def test_validate_type__variable
396+
SignatureManager.new do |manager|
397+
manager.add_file("foo.rbs", <<-EOF)
398+
class Foo
399+
@foo: Nothing
400+
@bar: Integer
401+
402+
self.@foo: Nothing
403+
self.@bar: Integer
404+
405+
@@foo: Nothing
406+
@@bar: Integer
407+
end
408+
EOF
409+
410+
manager.build do |env|
411+
root = nil
412+
413+
resolver = RBS::Resolver::TypeNameResolver.new(env)
414+
validator = RBS::Validator.new(env: env, resolver: resolver)
415+
416+
env.class_decls[RBS::TypeName.parse("::Foo")].decls.first.decl.members.tap do |members|
417+
members[0].tap do |member|
418+
assert_raises(RBS::NoTypeFoundError) do
419+
validator.validate_variable(member)
420+
end
421+
end
422+
423+
members[1].tap do |member|
424+
validator.validate_variable(member)
425+
end
426+
427+
members[2].tap do |member|
428+
assert_raises(RBS::NoTypeFoundError) do
429+
validator.validate_variable(member)
430+
end
431+
end
432+
433+
members[3].tap do |member|
434+
validator.validate_variable(member)
435+
end
436+
437+
members[4].tap do |member|
438+
assert_raises(RBS::NoTypeFoundError) do
439+
validator.validate_variable(member)
440+
end
441+
end
442+
443+
members[5].tap do |member|
444+
validator.validate_variable(member)
445+
end
446+
end
447+
end
448+
end
449+
end
394450
end

0 commit comments

Comments
 (0)