diff --git a/lib/rbs/cli/validate.rb b/lib/rbs/cli/validate.rb index 6a6ded92f..b4ba30897 100644 --- a/lib/rbs/cli/validate.rb +++ b/lib/rbs/cli/validate.rb @@ -196,6 +196,7 @@ def validate_class_module_definition end InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location) when AST::Members::Var + @validator.validate_variable(member) void_type_context_validator(member.type) if member.is_a?(AST::Members::ClassVariable) no_self_type_validator(member.type) diff --git a/lib/rbs/validator.rb b/lib/rbs/validator.rb index 6e410f684..553241c9d 100644 --- a/lib/rbs/validator.rb +++ b/lib/rbs/validator.rb @@ -151,6 +151,10 @@ def validate_type_params(params, type_name: , method_name: nil, location:) end end + def validate_variable(var) + validate_type(var.type, context: nil) + end + def validate_class_alias(entry:) case env.normalize_module_name?(entry.decl.new_name) when nil diff --git a/sig/validator.rbs b/sig/validator.rbs index 82157d89b..bb93a5f2a 100644 --- a/sig/validator.rbs +++ b/sig/validator.rbs @@ -49,6 +49,10 @@ module RBS # def validate_class_alias: (entry: Environment::ClassAliasEntry | Environment::ModuleAliasEntry) -> void + # Validates instance/class-instance/class variables. + # + def validate_variable: (AST::Members::Var) -> void + private # Resolves relative type names to absolute type names in given context. diff --git a/test/validator_test.rb b/test/validator_test.rb index 71e87b4d9..725c9bfd9 100644 --- a/test/validator_test.rb +++ b/test/validator_test.rb @@ -391,4 +391,60 @@ def foo: () -> A end end end + + def test_validate_type__variable + SignatureManager.new do |manager| + manager.add_file("foo.rbs", <<-EOF) +class Foo + @foo: Nothing + @bar: Integer + + self.@foo: Nothing + self.@bar: Integer + + @@foo: Nothing + @@bar: Integer +end + EOF + + manager.build do |env| + root = nil + + resolver = RBS::Resolver::TypeNameResolver.new(env) + validator = RBS::Validator.new(env: env, resolver: resolver) + + env.class_decls[RBS::TypeName.parse("::Foo")].decls.first.decl.members.tap do |members| + members[0].tap do |member| + assert_raises(RBS::NoTypeFoundError) do + validator.validate_variable(member) + end + end + + members[1].tap do |member| + validator.validate_variable(member) + end + + members[2].tap do |member| + assert_raises(RBS::NoTypeFoundError) do + validator.validate_variable(member) + end + end + + members[3].tap do |member| + validator.validate_variable(member) + end + + members[4].tap do |member| + assert_raises(RBS::NoTypeFoundError) do + validator.validate_variable(member) + end + end + + members[5].tap do |member| + validator.validate_variable(member) + end + end + end + end + end end