From 0817698063e9cdb2804d0a6d422375fc2c2b97cf Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 20 Mar 2023 22:58:31 +0900 Subject: [PATCH 1/4] Support detailed_message for InvalidVarianceAnnotationError --- lib/rbs/errors.rb | 2 ++ test/rbs/definition_builder_test.rb | 30 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/rbs/errors.rb b/lib/rbs/errors.rb index f7356afb0..001a462c7 100644 --- a/lib/rbs/errors.rb +++ b/lib/rbs/errors.rb @@ -390,6 +390,8 @@ def initialize(name, *decls) end class InvalidVarianceAnnotationError < DefinitionError + include DetailedMessageable + attr_reader :type_name attr_reader :param attr_reader :location diff --git a/test/rbs/definition_builder_test.rb b/test/rbs/definition_builder_test.rb index 3368fb6a1..cba24df1a 100644 --- a/test/rbs/definition_builder_test.rb +++ b/test/rbs/definition_builder_test.rb @@ -572,16 +572,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 @@ -614,11 +632,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 From 1c503b625f87955fd27ae7ffc6d806ba2fe9332d Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 20 Mar 2023 23:04:06 +0900 Subject: [PATCH 2/4] Support detailed_message for RecursiveAliasDefinitionError --- lib/rbs/errors.rb | 2 ++ test/rbs/definition_builder_test.rb | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib/rbs/errors.rb b/lib/rbs/errors.rb index 001a462c7..f96ee1fe3 100644 --- a/lib/rbs/errors.rb +++ b/lib/rbs/errors.rb @@ -406,6 +406,8 @@ def initialize(type_name:, param:, location:) end class RecursiveAliasDefinitionError < DefinitionError + include DetailedMessageable + attr_reader :type attr_reader :defs diff --git a/test/rbs/definition_builder_test.rb b/test/rbs/definition_builder_test.rb index cba24df1a..89483b58a 100644 --- a/test/rbs/definition_builder_test.rb +++ b/test/rbs/definition_builder_test.rb @@ -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 From d15b41b192b38a31dc12ebcd5b9ef8305871cafe Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 20 Mar 2023 23:08:47 +0900 Subject: [PATCH 3/4] Support detailed_message for MixinClassError --- lib/rbs/errors.rb | 2 ++ test/rbs/ancestor_builder_test.rb | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/rbs/errors.rb b/lib/rbs/errors.rb index f96ee1fe3..de5dc9b4a 100644 --- a/lib/rbs/errors.rb +++ b/lib/rbs/errors.rb @@ -426,6 +426,8 @@ def location end class MixinClassError < DefinitionError + include DetailedMessageable + attr_reader :type_name attr_reader :member diff --git a/test/rbs/ancestor_builder_test.rb b/test/rbs/ancestor_builder_test.rb index 2bb50923a..96ea04c8d 100644 --- a/test/rbs/ancestor_builder_test.rb +++ b/test/rbs/ancestor_builder_test.rb @@ -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 @@ -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 @@ -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 From 14a12e600f8e20e8d7274332c7c692f25abf8fba Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 20 Mar 2023 23:16:59 +0900 Subject: [PATCH 4/4] Support detailed_message for RecursiveTypeAliasError --- lib/rbs/errors.rb | 2 ++ test/validator_test.rb | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib/rbs/errors.rb b/lib/rbs/errors.rb index de5dc9b4a..fd709a9cc 100644 --- a/lib/rbs/errors.rb +++ b/lib/rbs/errors.rb @@ -465,6 +465,8 @@ def mixin_name end class RecursiveTypeAliasError < BaseError + include DetailedMessageable + attr_reader :alias_names attr_reader :location diff --git a/test/validator_test.rb b/test/validator_test.rb index 75b39a73f..1fd486838 100644 --- a/test/validator_test.rb +++ b/test/validator_test.rb @@ -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