> On Aug 24, 2017, at 00:08, John McCall <rjmcc...@apple.com> wrote:
> 
>> 
>> What do people think? The meat of the change is tiny and below. The vast 
>> majority of the work is the long and painful fallout in the test suite, 
>> which I’m cautiously (and perhaps foolishly) stepping up to doing.
> 
> I think that’s an interesting improvement in this specific message, but it's 
> not obvious that it would be an improvement to all messages.

Hi John,

That is certainly true. I’ve already seen that after a few rounds of testing 
this and watching the changing output from the test suite. That’s why I emailed 
this list before getting too deep into this change. In general, I thought the 
output was better than before, but reasonable people might disagree. The only 
place where I felt the extra verbosity was clearly distracting was/is the 
‘where’ clause diagnostics.

> Generally the way we did things like this in Clang was to add a modifier to 
> the diagnostic string, so that it would look something like "%type1", which 
> would be understood to expand to a noun appropriate for the type.  That way, 
> it was easy to take advantage of it for a specific diagnostic, but you 
> weren't forced into it by default.  I think that’s still the right approach 
> here.


Interesting. Good to know. Setting aside what the default should be, and unless 
I’m missing something, the clang style “%type1” approach has the same 
underlying challenges as this patch:
The verbosity snowballs because the goal of printing the inner decl kind is 
complicated by having layered type qualifiers (optional, metatype, etc).
Having two very different approaches to printing a type during diagnostics is 
lame (i.e. dense native syntax versus verbose English descriptions).
Maybe the “right” approach – and I’m only half serious about this – is to have 
a way for the compiler to print ‘(/*struct*/Foo).Type?’. Is it ugly? Arguably. 
Is it dense? Yes. Does it snowball? No. Does it scale? Absolutely! For example, 
consider a nontrivial “optional dictionary of tuple” type. It might look like 
this: ‘[/*struct*/String : (/*class*/Foo, /*enum*/Bar)]?’. If knowing the decl 
kind is helpful, then the latter output is a huge improvement.

For whatever it may be worth, I’m not wed to this proposal. The motivation 
behind this patch was preparation for the eventual day when a new nominal type 
is created (like Chris’s “actor” proposal or something else). I could certainly 
narrow the scope of this work to rewording some of the diagnostics to be more 
decl kind agnostic. For example: “subclass” becomes “subtype”, “superclass 
type” becomes “inherited type”, etc. If people are open to that, I can narrow 
the focus of this work.

Cheers,
Dave
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to