-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Better subclass handling for argument_type_not_assignable
#56505
Comments
Summary: The error message for |
@bwilkerson 's comment here I think applies to fixing this issue:
|
@srawlins, should I open a new issue concerning The repro: typedef MyBadlyNamedTypedef = int Function(int);
void foo(MyBadlyNamedTypedef f) {}
void bar() {
foo(baz);
}
String baz(int x) => x.toString(); The error message: The argument type 'String Function(int)' can't be assigned to the parameter type 'MyBadlyNamedTypedef'. |
What are you proposing as an alternate message? |
To show the actual type somewhere, replace the Take my example. If you have a badly named typedef or you are unfamiliar with what it means, this could be really weird. Also, because of #57013, we still can't "Go to Type Definition" and see the typedef. So for |
I think good to track with a separate issue. Especially because there might be discussion on the messaging. I think it'd be great to show both type aliases and un-aliased actual types. But because of the lengthy message that creates, I think we essentially never do that, and default to the un-aliased types (or maybe it's a mixed bag). |
That seems like a reasonable thing to do. I think we should show both.
When we stick the URI of the type in messages to disambiguate them we end up with fairly long messages, but it's better than "Can't assign 'C' to 'C'." style messages. The alternative that I could imaging is to put the extra information in a context message, something like "The typedef 'MyBadlyNamedTypedef' is equivalent to 'int Function(int)'."
If the only reason to add this information to the message were because of the lack of navigation, I'd recommend that we fix the navigation and leave the message alone. But the message also gets displayed by the command-line analyzer, so I think that fixing that issue wouldn't impact this one. |
Alright, #57056 created. Thanks! |
When we have a subclass (different type parameter) being used instead of the expected class on a parameter we have a bad error message compared to when we use the expected class.
Also, the current good error message is a bit redundant in the following example. I'm having the declaration path for
Iterable
twice on the error message (shortened it here to make the message more easy to see in the issue but in my case it is really big) and the actual problem is simply the type parameter for the elements.Repro:
a.dart
:main.dart
:On main.dart line 5
list.addAll(A.list)
, we get:The argument type 'List<A>' can't be assigned to the parameter type 'Iterable<A>'. dart(argument_type_not_assignable)
On line 6
list.addAll(A.iterable)
we get a way better error message:The text was updated successfully, but these errors were encountered: