I really want the compiler to be more specific about what worked and what didn't in error messages. Check this out.

---
void foo(int a, string b) {}
void foo(string b) {}

void main() {
        foo(10.2, "foo");
}
---

k.d(5): Error: None of the overloads of 'foo' are callable using argument types (double, string), candidates are:
k.d(1):        k.foo(int a, string b)
k.d(2):        k.foo(string b)


A relevant piece is (double, string), what I passed to it, but it is kinda mixed into the rest of the line. Moreover, what one didn't match?

We already highlight the word "Error:". I propose we also highlight stuff in the details lines, like this (pretending the color tags actually came through)

k.d(1):        k.foo(<red>int</red> a, <green>string</green> b)
k.d(2):        k.foo(<red>string</red> b)


The first arg I passed never fit the first arg of the options, they get red color. My string did pass one though, so it gets green to highlight a partial match.



Doing this on template constraints too (along with formatting them with some whitespace) would be huge toward making those std.algorithm errors be readable as well.



Moreover, I wouldn't mind if the compiler had an error output format that could spit out xml or something for computer consumption, with the same level of detail (if not more). If I were overhauling it all, I'd make all error messages inside the compiler be marked up to the max, then the top layer prints them appropriately for the device it is talking to (so disabling color on pipes, pretty printing for users, etc)


But the specifics aren't as important as having the compiler just somehow make it obvious at a glance what worked and what didn't. It could also do:

k.d(1):        k.foo(int a, string b)
                     ^^^    ++++++
k.d(2):        k.foo(string b)
                     ^^^^^^

or whatever instead of (or addition to, let's not forget a lot of people can't see color and the contrast on terminals may be quite poor) color.

Reply via email to