> On May 15, 2017, at 4:03 PM, Xiaodi Wu via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> This is nice. Thanks for taking the time to write it up. I do have some 
> concerns/questions:
> 
> Do the rules you spell out align with those for Codable? I think it is very 
> important that these are paralleled as closely as possible, and that any 
> deviations are explicitly called out in the text with reasoning as to why it 
> must deviate. Knowing when something is synthesized is difficult enough with 
> one set of rules--two is certainly one too many.
To spell out the rules of Codable conformance clearly, for reference:

> For example, is it permitted to extend a type in the same module in order to 
> obtain synthesized Codable conformance? How about for a type in a different 
> module? The same rules should then apply for Equatable and Hashable synthesis.
Yes, Codable conformance can be added in an extension both intra-module, and 
inter-module (i.e. you can add Codable conformance via extensions in your own 
module, or to types in other modules). If there is a situation where this is 
not possible, that’s likely a bug.
[For reference, it is actually easier to allow this than to prevent it. I had 
to do very little extra work to support this because of how this is organized 
in the compiler.]

> Furthermore, does Codable ignore computed properties? If not, then neither 
> should Equatable and Hashable.
Yes. Derived conformance for Codable ignores all computed properties (including 
lazy properties and their associated storage). This is also some relatively 
easy default behavior; you can iterate all properties matching this requirement 
via `NominalTypeDecl.getStoredProperties` 
(getStoredProperties(/*skipInaccessible=*/true) will skip the storage 
associated with lazy vars).
[The thought process here is that accessing computed vars (and more so lazy 
vars) will generally have side effects. We don’t want to trigger side effects 
on encoding/checking for equality/hashing, and in general, those types of 
properties will not affect equality/hash value/encoded representation.]

> There are also some complicated rules with generics, if I recall, that may 
> force something to be a computed property. It would be worth exploring if 
> such rules make ignoring computed properties counterintuitive. For instance, 
> if a user has to redesign the type, changing a stored property to a computed 
> property just to satisfy certain rules of the language, and all of a sudden 
> the definition of equality has silently changed as a consequence, then that 
> could end up being very hard to debug. If we find that this is a plausible 
> issue, then it might be worth considering refusing to synthesize Equatable 
> conformance for a type with any computed properties--obviously limiting, but 
> better limiting than surprising. To be clear, I'm not suggesting that we do 
> make this limitation, just that I don't know that the consequences have been 
> adequately explored for not including computed properties.
I’m not sure about this — someone else will have to weigh in. I don’t think 
I’ve ever encountered a situation like this while working on Codable. That 
being said, if there’s a limiting factor here that we encounter, we should 
absolutely be consistent between all implementations of derived conformance. 

It would be helpful to document these rules somewhere, so noted.

> On Mon, May 15, 2017 at 17:21 Tony Allevato via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> Yes—the PR of the proposal is here: 
> https://github.com/apple/swift-evolution/pull/706 
> <https://github.com/apple/swift-evolution/pull/706>
> 
> It needs to be updated slightly—I'll remove the references to the 
> "multiplicative hash function" recommendation because I ended up using the 
> existing _mixInt and xor, which is how the standard library implements its 
> Collection hashValues. (The proposal probably really doesn't need to state 
> anything about the hash function used, and its entirely an implementation 
> detail.)
> 
> 
> On Mon, May 15, 2017 at 3:18 PM Andrew Bennett <cac...@gmail.com 
> <mailto:cac...@gmail.com>> wrote:
> Nice work Tony! Is this proposal up for PR on swift-evolution as well?
> 
> On Tue, 16 May 2017 at 7:30 am, Tony Allevato <tony.allev...@gmail.com 
> <mailto:tony.allev...@gmail.com>> wrote:
> Just to update everyone on the thread—it took a little longer than I'd hoped 
> to get the kinks out, but I finally have the implementation up as a PR: 
> https://github.com/apple/swift/pull/9619 
> <https://github.com/apple/swift/pull/9619>
> 
> Hopefully there's still enough time to get the proposal reviewed, make any 
> changes needed, and get this into Swift 4!
> 
> 
> On Tue, May 9, 2017 at 10:27 PM Brent Royal-Gordon <br...@architechies.com 
> <mailto:br...@architechies.com>> wrote:
>> On May 9, 2017, at 3:53 PM, Tony Allevato via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> Likewise, proposing a new public addition to the standard library would 
>> inspire far more design discussion than I believe we have time for if we 
>> want this to make Swift 4. :)
> 
> 
> Agreed. What I would do here is add an `_combineHashes` function (or 
> `Hashable` extension method, or whatever is most convenient) to the standard 
> library in Swift 4, have your compiler magic feature use it, and defer the 
> name-and-interface discussion until Swift 5.
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 
> _______________________________________________
> 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