> On 5 Oct 2017, at 07:34, Jose Cheyo Jimenez via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I appreciate the enthusiasm but this is not a bug. This was a deliberate 
> change in swift 3 to make `private extension` usable. If this was a bug then 
> during swift 3 we should have disallowed `private extension` and only allowed 
> `fileprivate extension` but that is not what happened. `private extension` 
> has worked the same since swift 1. I’ve always used `private extension` when 
> I want to add methods to String or other build in types. 

It’s not a bug, but its unfortunate the behaviour wasn’t changed at the same 
time as SE-0169, and it now is very inconsistent. I also don’t have to rehash 
previous discussions, but if a Core Team member (Chris) is okay with going 
ahead with this, perhaps we should consider it.

> private is different because it is scoped so because of that it is also 
> different when dealing with extensions. Top level private is always the same 
> as fileprivate thanks to its scoped nature. 
> 
> Making private the scope ACL was a mistake but that ship has sailed and so 
> has this one imo. 
> 
> 
> 
> On Oct 4, 2017, at 10:05 PM, Tony Allevato <tony.allev...@gmail.com 
> <mailto:tony.allev...@gmail.com>> wrote:
> 
>> Trust me, I'm the last person who wants to rehash access levels in Swift 
>> again. But that's not what's happening here, IMO, and fixing bugs is not 
>> just "a change for the sake of changing."
>> 
>> The current behavior of "private extension" is *incorrect*, because it's 
>> entirely inconsistent with how access levels on extensions are documented to 
>> behave and it's inconsistent with how other access levels apply to 
>> extensions.
>> 
>> Can anyone think of a reason—other than "it's too late to change it"—why 
>> "private extension" and "fileprivate extension" should behave the same, and 
>> why "X extension { decl }" should be identical to "extension { X decl }" for 
>> all X *except* "private"?
>> 
>> Yes, it's absolutely unfortunate that this oversight was not addressed when 
>> the other access level changes were made. But we shouldn't have to live with 
>> bugs in the language because we're afraid of some unknown amount of churn 
>> among code that is already written incorrectly. Nor is fixing this bug 
>> declaring open season on other, unrelated access level debates. Do you have 
>> data that shows that the amount of code broken because it's using "private" 
>> when it really should be saying "fileprivate" is high enough that we should 
>> just leave the bug there?
>> 
>> On Wed, Oct 4, 2017 at 9:51 PM Jose Cheyo Jimenez via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> There was a high bar for breaking changes in swift 4 and is even higher for 
>> swift 5.  se-110 was approved and implemented on the premises that it was 
>> not a big change but it was breaking code so it got reverted. Sure the 
>> migrator was making this easier but the result was a usability regression. I 
>> think this is a change just for the sake of changing. This will cause 
>> unnecessary churn. Let’s leave ACLs alone for the next few versions of swift 
>> unless we have a way better system. 
>> 
>> https://lists.swift.org/pipermail/swift-evolution-announce/2017-June/000386.html
>>  
>> <https://lists.swift.org/pipermail/swift-evolution-announce/2017-June/000386.html>
>> 
>> 
>> 
>> 
>> 
>> On Oct 4, 2017, at 8:47 PM, BJ Homer <bjho...@gmail.com 
>> <mailto:bjho...@gmail.com>> wrote:
>> 
>>> It certainly could break *some* code. But it only breaks code written by an 
>>> author who wrote ‘private extension’ knowing that ‘fileprivate extension’ 
>>> was also an option, but still intended it to be shared with the whole file. 
>>> (If that code was from Swift 2, it would have already been migrated to 
>>> ‘fileprivate extension’ by the 2->3 migrator.)
>>> 
>>> So existing code that says ‘private extension’ was written in a Swift 3 or 
>>> 4 era when ‘fileprivate’ was an option. If the goal was specifically to 
>>> share it with the whole file, it seems likely that most authors would have 
>>> used ‘fileprivate extension’ instead of ‘private extension’, as that better 
>>> communicates the intention. Regardless, though, we could check against the 
>>> Swift source compatibility test suite to see how widespread that is.
>>> 
>>> Regardless, I think this change makes Swift a better language, and I’m in 
>>> favor of it.
>>> 
>>> -BJ
>>> 
>>> On Oct 4, 2017, at 9:10 PM, Jose Cheyo Jimenez via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>>> 
>>>> 
>>>> On Oct 2, 2017, at 9:59 PM, David Hart via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>>> 
>>>>> 
>>>>> On 3 Oct 2017, at 05:12, Xiaodi Wu via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>>> On Mon, Oct 2, 2017 at 9:16 PM, Matthew Johnson via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>> 
>>>>>> 
>>>>>> Sent from my iPad
>>>>>> 
>>>>>> On Oct 2, 2017, at 7:33 PM, Jordan Rose via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Oct 2, 2017, at 03:25, Vladimir.S via swift-evolution 
>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>> 
>>>>>>>> On 01.10.2017 1:18, Chris Lattner wrote:
>>>>>>>>>> On Sep 29, 2017, at 10:42 AM, Xiaodi Wu via swift-evolution 
>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>>>> 
>>>>>>>>>> Vladimir, I agree with you on that change, but it’s a separate topic 
>>>>>>>>>> from this one.
>>>>>>>>>> 
>>>>>>>>>> Tony is absolutely correct that this topic has already been 
>>>>>>>>>> discussed. It is a deliberate design decision that public types do 
>>>>>>>>>> not automatically expose members without explicit access modifiers; 
>>>>>>>>>> this has been brought up on this list, and it is clearly not in 
>>>>>>>>>> scope for discussion as no new insight can arise this late in the 
>>>>>>>>>> game. The inconsistency with public extensions was brought up, the 
>>>>>>>>>> proposed solution was to remove modifiers for extensions, but this 
>>>>>>>>>> proposal was rejected. So, the final design is what we have.
>>>>>>>>> Agreed.  The core team would only consider a refinement or change to 
>>>>>>>>> access control if there were something actively broken that mattered 
>>>>>>>>> for ABI stability.
>>>>>>>> 
>>>>>>>> So we have to live with *protected* extension inconsistency for very 
>>>>>>>> long time just because core team don't want to even discuss _this 
>>>>>>>> particular_ inconsistency(when access level in *private extension* 
>>>>>>>> must be private, not fileprivate)?
>>>>>>>> 
>>>>>>>> Yes, we decided that access level for extension will mean a default 
>>>>>>>> and top most access level for nested methods, OK. But even in this 
>>>>>>>> rule, which already differ from access modifiers for types, we have 
>>>>>>>> another one special case for 'private extension'.
>>>>>>>> 
>>>>>>>> Don't you think this is not normal situation and actually there IMO 
>>>>>>>> can't be any reason to keep this bug-producing inconsistency in Swift? 
>>>>>>>> (especially given Swift 5 seems like is a last moment to fix this)
>>>>>>> 
>>>>>>> I hate to say it but I'm inclined to agree with Vladimir on this. 
>>>>>>> "private extension" has a useful meaning now distinct from "fileprivate 
>>>>>>> extension", and it was an oversight that SE-0169 
>>>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0169-improve-interaction-between-private-declarations-and-extensions.md>
>>>>>>>  didn't include a fix here. On this very narrow, very specific access 
>>>>>>> control issue I think it would still be worth discussing; like Xiaodi 
>>>>>>> said it's not related to James' original thread-starter.
>>>>>> 
>>>>>> I agree with this in principle but would not want to see it become a 
>>>>>> slippery slope back into extremely long access control discussions.
>>>>>> 
>>>>>> 
>>>>>> As I've said elsewhere, I too agree with this in principle. I agree with 
>>>>>> Jordan that the current state of things is justifiable but the 
>>>>>> alternative would be somewhat superior, agree that in a vacuum this very 
>>>>>> narrow and specific discussion might be warranted, and agree also that 
>>>>>> this could be a very slippery slide down a very steep slope.
>>>>> 
>>>>> Same here. It’s the only grudge I have left with the current access 
>>>>> control situation. I remember Doug Gregor and John McCall discussing this 
>>>>> during the last access control proposal. And I wouldn’t mind having a 
>>>>> very narrow discussion about only this.
>>>>> 
>>>>> I organize my types into extensions for each conformance and for each 
>>>>> access control. I can currently implicitly apply public or fileprivate to 
>>>>> all members of an extension but I have no way of doing the same for 
>>>>> private. That’s why I think it should be fixed.
>>>> 
>>>> This will break a bunch of code because `private extension` has always 
>>>> meant `fileprivate extension`. Even Swift 3 had this same behavior. 
>>>> Lowering the access level of the extension members will hide a bunch of 
>>>> code that was visible to the file. 
>>>> 
>>>> 169 was not a breaking change but this “fix” would have made it a breaking 
>>>> change. I doubt 169 would had been accepted if it was a breaking change. I 
>>>> don’t think it’s worth it. 
>>>> 
>>>> 
>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0169-improve-interaction-between-private-declarations-and-extensions.md
>>>>  
>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0169-improve-interaction-between-private-declarations-and-extensions.md>
>>>> 
>>>> 
>>>> 
>>>>> 
>>>>>>> 
>>>>>>> (I maintain that the current model does not include a special case; it 
>>>>>>> simply means the 'private' is resolved at the level of the extension 
>>>>>>> rather than the level of its members. But that isn't what people expect 
>>>>>>> and it's not as useful.)
>>>>>>> 
>>>>>>> 
>>>>>>> I agree that changing the behavior of all access modifiers on 
>>>>>>> extensions is out of scope. (I also agree that it is a bad idea. Sorry, 
>>>>>>> James, but wanting 'pubic' here indicates that your mental model of 
>>>>>>> extensions does not match what Swift is actually doing, and that could 
>>>>>>> get you into trouble.)
>>>>>>> 
>>>>>>> Jordan
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to