[swift-evolution] [Proposal] Revising access modifiers on extensions
L. Mihalkovic
laurent.mihalkovic at gmail.com
Sun Jun 26 23:06:33 CDT 2016
There was an exchange in the past on how extensions are very different from swift nominal/structural types, and Doug even shared how adding scoping to extensions is not a trivial task by a long shot. In this context, talking about unifying modifier behaviors does not make much sense to me. I am not sure i understand what motivates this change.
Regards
(From mobile)
> On Jun 26, 2016, at 8:59 PM, Adrian Zubarev via swift-evolution <swift-evolution at swift.org> wrote:
>
> Proposal is moved to a git repo: https://github.com/DevAndArtist/swift-evolution/blob/extensions_access_modifiers/proposals/nnnn-extensions-access-modifiers.md
>
> I also updated a few things for readability.
> Revising access modifiers on extensions
>
> Proposal: SE-NNNN
> Author: Adrian Zubarev
> Status: Awaiting review
> Review manager: TBD
> Introduction
>
> One great goal for Swift 3 is to sort out any source breaking language changes. This proposal aims to fix access modifier inconsistency on extensions compared to other scope declarations types.
>
> Swift-evolution thread: [Proposal] Revising access modifiers on extensions
>
> Motivation
>
> When declaring members on extensions which don’t have an explicit access modifier in Swift 2.2, it is possible to create an implicitly public extension by applying a public modifier to at least one extension member.
>
> public struct A { … }
>
> // Implicitly public
> extension A {
> public var member1: SomeType { … }
>
> // Implicitly internal
> func member2() { … }
> }
>
> // Implicitly internal
> extension A {
>
> // Implicitly internal
> var member3: SomeType { … }
> }
> Furthermore in Swift 2.2 it is not allowed to apply an access modifier on extensions when a type inheritance clause is present:
>
> public protocol B { … }
>
> // 'public' modifier cannot be used with
> // extensions that declare protocol conformances
> public extension A : B { … }
> Proposed solution
>
> Allow access modifier on extensions when a type inheritance clause is present.
>
> Remove the behavior of an implicit public extension.
>
> This changes should make access modifier on extensions consistent to classes, structs and enums (and SE–0025).
>
> The current grammar will not change:
>
> extension-declaration → access-level-modifieropt extension type-identifier type-inheritance-clauseopt extension-body
>
> extension-declaration → access-level-modifieropt extension type-identifier requirement-clause extension-body
>
> extension-body → { declarationsopt }
>
> Iff the access-level-modifier is not present, the access modifier on extensions should always be implicitly internal.
>
> Impact on APIs:
>
> Current version:
>
> /// Implementation version
> ///========================
>
> public protocol Y {
> func member()
> }
>
> public struct X { … }
>
> // Implicitly public
> extension X : Y {
> public func member() { ... }
>
> // Implicitly internal
> func anotherMember() { ... }
> }
>
> /// Imported modele version
> ///========================
>
> public protocol Y {
> func member()
> }
>
> public struct X { ... }
>
> // Missing `public` modifier
> extension X : Y {
> public func member() { ... }
> }
> New Version:
>
> /// Implementation version
> ///========================
>
> public extension X : Y {
> public func member() { ... }
>
> // Implicitly internal
> func anotherMember() { ... }
> }
>
> /// Imported modele version
> ///========================
>
> public extension X : Y {
> public func member() { ... }
> }
> Impact on existing code
>
> This is a source-breaking change that can be automated by a migrator, by simply scanning the extension-body for at least one public modifier on its members. Iff a public modifier was found on any member, the migrator can add an explicit public modifier to the extension itself.
>
> Alternatives considered
>
> No other alternative were considered for this proposal.
> Rationale
>
> On [Date], the core team decided to (TBD) this proposal. When the core team makes a decision regarding this proposal, their rationale for the decision will be written here.
>
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160627/a4333c10/attachment.html>
More information about the swift-evolution
mailing list