Skip to content

Commit

Permalink
Merge pull request #1285 from ksss/errors-3
Browse files Browse the repository at this point in the history
Support detailed_message for InvalidVarianceAnnotationError, RecursiveAliasDefinitionError, MixinClassError and RecursiveTypeAliasError
  • Loading branch information
soutaro authored Mar 22, 2023
2 parents fa44bb3 + 14a12e6 commit 2e38549
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/rbs/errors.rb
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,8 @@ def initialize(name, *decls)
end

class InvalidVarianceAnnotationError < DefinitionError
include DetailedMessageable

attr_reader :type_name
attr_reader :param
attr_reader :location
Expand All @@ -404,6 +406,8 @@ def initialize(type_name:, param:, location:)
end

class RecursiveAliasDefinitionError < DefinitionError
include DetailedMessageable

attr_reader :type
attr_reader :defs

Expand All @@ -422,6 +426,8 @@ def location
end

class MixinClassError < DefinitionError
include DetailedMessageable

attr_reader :type_name
attr_reader :member

Expand Down Expand Up @@ -459,6 +465,8 @@ def mixin_name
end

class RecursiveTypeAliasError < BaseError
include DetailedMessageable

attr_reader :alias_names
attr_reader :location

Expand Down
21 changes: 21 additions & 0 deletions test/rbs/ancestor_builder_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,13 @@ class Qux

assert_raises MixinClassError do
builder.instance_ancestors(type_name("::Qux"))
end.tap do |error|
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::MixinClassError)

include Foo
^^^^^^^^^^^
DETAILED_MESSAGE
end
end
end
Expand All @@ -723,6 +730,13 @@ class Qux

assert_raises MixinClassError do
builder.instance_ancestors(type_name("::Qux"))
end.tap do |error|
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::MixinClassError)

prepend Foo
^^^^^^^^^^^
DETAILED_MESSAGE
end
end
end
Expand All @@ -747,6 +761,13 @@ class Qux

assert_raises MixinClassError do
builder.one_singleton_ancestors(type_name("::Qux"))
end.tap do |error|
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::MixinClassError)

extend Foo
^^^^^^^^^^
DETAILED_MESSAGE
end
end
end
Expand Down
37 changes: 37 additions & 0 deletions test/rbs/definition_builder_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,13 @@ def foo: () -> void

assert_raises(RBS::RecursiveAliasDefinitionError) do
builder.build_interface(type_name("::_I3"))
end.tap do |error|
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::RecursiveAliasDefinitionError)
alias a b
^^^^^^^^^
DETAILED_MESSAGE
end

assert_raises(RBS::DuplicatedMethodDefinitionError) do
Expand Down Expand Up @@ -572,16 +579,34 @@ class Test3[in X]
assert_raises(InvalidVarianceAnnotationError) { builder.build_instance(type_name("::Test1")) }.tap do |error|
assert_equal :X, error.param.name
assert_equal "C[X]", error.location.source
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::InvalidVarianceAnnotationError)
class Test1[in X] < C[X]
^^^^
DETAILED_MESSAGE
end

assert_raises(InvalidVarianceAnnotationError) { builder.build_instance(type_name("::Test2")) }.tap do |error|
assert_equal :X, error.param.name
assert_equal "include M[X]", error.location.source
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::InvalidVarianceAnnotationError)
include M[X]
^^^^^^^^^^^^
DETAILED_MESSAGE
end

assert_raises(InvalidVarianceAnnotationError) { builder.build_instance(type_name("::Test3")) }.tap do |error|
assert_equal :X, error.param.name
assert_equal "include _I[X]", error.location.source
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::InvalidVarianceAnnotationError)
include _I[X]
^^^^^^^^^^^^^
DETAILED_MESSAGE
end
end
end
Expand Down Expand Up @@ -614,11 +639,23 @@ class Test2[in X]
assert_raises(InvalidVarianceAnnotationError) { builder.build_instance(type_name("::Test1")) }.tap do |error|
assert_equal :X, error.param.name
assert_equal "(X) -> void", error.location.source
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::InvalidVarianceAnnotationError)
def foo: (X) -> void
^^^^^^^^^^^
DETAILED_MESSAGE
end

assert_raises(InvalidVarianceAnnotationError) { builder.build_instance(type_name("::Test2")) }.tap do |error|
assert_equal :X, error.param.name
assert_equal "attr_reader x: X", error.location.source
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::InvalidVarianceAnnotationError)
attr_reader x: X
^^^^^^^^^^^^^^^^
DETAILED_MESSAGE
end
end
end
Expand Down
7 changes: 7 additions & 0 deletions test/validator_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@ def test_validate_recursive_type_alias
env.type_alias_decls.each do |name, decl|
assert_raises RBS::RecursiveTypeAliasError do
validator.validate_type_alias(entry: decl)
end.tap do |error|
assert_equal <<~DETAILED_MESSAGE, error.detailed_message if Exception.method_defined?(:detailed_message)
#{error.message} (RBS::RecursiveTypeAliasError)

#{decl.decl.location.source}
#{"^" * decl.decl.location.source.length}
DETAILED_MESSAGE
end
end
end
Expand Down

0 comments on commit 2e38549

Please sign in to comment.