> On Aug 24, 2017, at 10:41 AM, David Zarzycki <zarzy...@icloud.com> wrote:
>> On Aug 24, 2017, at 00:08, John McCall <rjmcc...@apple.com 
>> <mailto: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.

I think making it easy to have a better noun than "type" before a type in a 
diagnostic is valuable, but yeah, I think you need to:
  - take it as a mission to not use more than two words as an introducer
  - be cool with falling back to "type" if you're not sure what else to say
  - think carefully about whether using a more specific noun than "type" is 
really providing any non-obvious information

For example, "type" is probably fine to introduce function types, because it's 
usually visually obvious that a type is a function type.  On the other hand, 
you could consider using a more precise noun in the same sort of situations 
where you might print an aka clause, e.g.:
  can't frobonicate with function type 'HappyCallback' (aka '(HappyContext) -> 
()')

Finally, of course, it's okay just to make incremental improvements instead of 
trying to make everything perfect all at once. :)

John.
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to