> I am not convinced this is necessary.  If there *is* a containing 'private' 
> scope you can just leave the member unannotated to get this behavior.  If 
> there isn't you can use 'fileprivate' as it is already defined.  Why is that 
> not sufficient?

Here's what's making me think about this: In our current generated interfaces, 
we mark every symbol with an access modifier (except for protocol requirements, 
which cannot take access modifiers). This is because every kind of visibility 
*has* an associated access modifier. They are all utterable, and this makes 
everything clearer, because when you want to be explicit you can always write 
it out.

I don't like the idea of introducing unutterable access control levels, or 
marking things with confusingly broad-seeming access modifiers, or complicating 
the access control model with artificial levels. On those axes, I would score 
the various options as:

        Worst: Having an extra, unutterable access modifier that floats 
relative to the other access levels.

        Awful: Having an extra access modifiers that floats relative to the 
other access levels, but has a name (like `default`).

        Bad: Having an extra, unutterable access modifier between `fileprivate` 
and `private`.

        Okay: Using `internal` whenever there's no access modifier, and not 
warning if the effective scope is smaller.

        Good: Having an extra access modifier between `fileprivate` and 
`private`, but which has a name (like `inheritprivate`) 

        Better: Changing the definition of `fileprivate` to be within the 
surrounding private type if there is one, without changing the keyword.

        Best: Changing the definition of `fileprivate` to be within the 
surrounding private type if there is one, and changing the keyword to match.

If I were implementing it, I think what I would do at this point is:

        1. Implement the feature with support for private types artificially 
disabled. At this point, you have provided a strict subset of what the proposal 
specifies; if the implementation is good enough, that ought to be mergeable.

        2. Create a new branch from that commit which implements the change to 
`fileprivate`'s semantics I described. This is a highly plausible way to fill 
the gap in the proposal, and exploring it seems like a sensible option.

        3. Leave the keyword alone; that's up to the core team to change.

Of course, I'm *not* implementing it; Robert Widmann is. So I think that for 
step 2 he should implement whichever solution he thinks is best, or if he's 
worried about wasting work, simply pause at that point and wait for core team 
input.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to