> On Feb 21, 2017, at 10:29 PM, Robert Widmann <[email protected]> wrote:
> 
> This level of access, the “private to this submodule except to the select set 
> of interfaces I want to see it” level, is the equivalent of friend classes in 
> C++.  I don’t consider leaving this out to be a hole, nor is it an 
> "encapsulation-related problem” because at no point can you break the API 
> boundary and re-export anything here with a higher level of access than it 
> had previously.

By API boundary you mean the top-level module, right?

> 
>> On Feb 21, 2017, at 11:13 PM, Matthew Johnson <[email protected]> wrote:
>> 
>> 
>>> On Feb 21, 2017, at 10:11 PM, Matthew Johnson <[email protected]> 
>>> wrote:
>>> 
>>> 
>>>> On Feb 21, 2017, at 9:47 PM, Brent Royal-Gordon via swift-evolution 
>>>> <[email protected]> wrote:
>>>> 
>>>>> On Feb 21, 2017, at 7:38 PM, Robert Widmann <[email protected]> 
>>>>> wrote:
>>>>> 
>>>>> Correct.  Because, in dividing the submodule across an extension, you 
>>>>> have placed what should be a private API into a differently-scoped 
>>>>> location.
>>>> 
>>>> Okay. So is your submodule design not intended to address the "I want to 
>>>> encapsulate implementation details so they're only visible to several 
>>>> units of code in different files, but not the entire module" use case? 
>>>> Because if there's no way to scope a symbol to "everything inside this 
>>>> submodule, but nothing outside this submodule", I think it leaves that use 
>>>> case unserved.
>>> 
>>> Unless I’m missing something there is also another encapsulation-related 
>>> problem with the proposed design.  Let’s suppose for the sake of discussion 
>>> there was a `submoduleprivate` access modifier (intentionally ungainly and 
>>> not realistic).
>>> 
>>> // File 1
>>> module Foo {
>>>  // internal, visible to the whole module
>>>  class Bar { submoduleprivate var protectedState: Int = 0 }
>>> }
>>> 
>>> // File 2 - Has nothing to do with Foo at all
>>> import MyModule.Foo
>>> 
>>> module NotFoo {
>>> // Hey, I need to see Bar.protectedState!!!
>>> func totallyNotFoo() {
>>>     var bar = Bar()
>>>     bar.foosExposedPrivates = 42
>>> }
>>> }
>>> 
>>> // ok, I’ll just add an extension to Foo so I can see submoduleprivate and 
>>> wrap what I need
>>> module Foo {
>> 
>> Oops, this should have been `extension Foo`, but otherwise I believe it is 
>> valid under this proposal.
>> 
>>>  // Hey, I’ll be nice and keep it fileprivate, but I could make it public 
>>> if I wanted to.
>>>  extension Foo {
>>>       fileprivate var foosExposedPrivates: Int {
>>>          // Yep, I’m inside Foo so I can see it’s submoduleprivate stuff
>>>          get { return protectedState }
>>>          set  { protectedState = newValue }
>>>       }
>>>  }
>>> }
>>> 
>>>> 
>>>> -- 
>>>> Brent Royal-Gordon
>>>> Architechies
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected]
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>> 
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to