> On Jan 2, 2018, at 3:41 PM, Xiaodi Wu <[email protected]> wrote:
>
> On Tue, Jan 2, 2018 at 3:27 PM, Kevin Nattinger <[email protected]
> <mailto:[email protected]>> wrote:
> [...]
>
>>> in what other circumstances do we insist that the compiler inform the end
>>> user about future additions to the API at compile time?
>>
>> This isn’t a request for the compiler to inform the user about future
>> additions to an API. It is a request to validate the compiler’s knowledge
>> of the current state of an API with the current state of the source code.
>>
>> Well, it's of course impossible to inform the user about future additions,
>> so that's poorly phrased on my part. It's about the compiler informing the
>> end user about *new* additions, part of the *current* state of the API, that
>> have cropped up since the user last revised the code when the API was in a
>> *previous* state (or, indistinguishably, members of which a user is unaware
>> regardless of the temporal sequence of when such members were added). In
>> what other circumstances do we insist that the compiler perform this service?
>
> Enums. That's literally how they work today. You are arguing in favor of
> actively removing compiler-aided correctness.
>
> There's also protocol requirements
>
> No, that's now how enums work today, and it's not how protocol requirements
> work today. Enums today are all semantically exhaustive; if a case is added
> in a later version of a library, it's semantically a *different* enum type
> that happens to share the same name. Not considering all the cases of an
> exhaustive enum is an _error_, not a _warning_, because there is no basis on
> which to proceed. This will not change with the proposal. Likewise, adding a
> protocol requirement without a default implementation is source-breaking. The
> result is a compiler _error_.
>
> The question is, what non-source breaking API additions today cause the
> compiler to inform the end user of such additions?
Posing the question this way takes it as a given that adding a case to a
resilient enum is non-source breaking with a full stop. The position of
everyone asking for something like `future` / `unknown` as an alternative to
`default` is exactly that this should not be the case. Instead, adding a case
should always be binary compatible and should be source compatible by default,
but authors should have the ability to opt-in to making case additions be
source-breaking for individual switch statements.
When you view it this way we are not asking the compiler to inform us of a
non-source breaking addition. We are asking the compiler to treat an addition
as source breaking in a specific context.
> The answer is: none whatsoever. Not new methods or properties on a type, not
> even new protocol requirements that have a default implementation.
>
>
> and, arguably, deprecated methods with a proper message ("use foo instead").
>
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution