Hello swift-evolution,
I took the pitch originally from Developer to move the where clause out of the
generic parameter list, with improvements brought up by Pyry Jahkola, and wrote
a proposal for it. I opened a Pull Request, but if anybody wants to bring some
modifications to it before it is merged, please let me know what you think:
Move where clause to end of declaration
Proposal: SE-XXXX
<https://github.com/apple/swift-evolution/blob/master/proposals/XXXX-move-where-expression.md>
Author(s): David Hart <https://github.com/hartbit>, Developer, Pry Jahkola
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/[email protected]>
Status: TBD
Review manager: TBD
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#introduction>Introduction
This proposal suggests moving the where clause to the end of the declaration
syntax, but before the body, for readability reasons. It has been discussed at
length on the following swift-evolution thread:
[Pitch] Moving where Clauses Out Of Parameter Lists
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/GMANE_DOWN_FOR_NOW>
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#motivation>Motivation
The where clause in declarations can become quite long. When that happens, it
breaks the declaration syntax in two, hurting its readability. There is also no
good way of formatting the declaration syntax to make it much better.
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#proposed-solution>Proposed
solution
The proposal suggests moving the where clause at the end of the declaration,
but before the body of concerned declarations. With the proposed change, where
clauses do not impede the main declaration and are also more easily
formattable. For example, here is the same function declaration before and
after the change:
func anyCommonElements<T : SequenceType, U : SequenceType where
T.Generator.Element: Equatable,
T.Generator.Element == U.Generator.Element>(lhs: T, _ rhs: U) -> Bool where
{
...
}
func anyCommonElements<T : SequenceType, U : SequenceType>(lhs: T, _ rhs: U) ->
Bool where
T.Generator.Element: Equatable,
T.Generator.Element == U.Generator.Element
{
...
}
This proposal has no impact on extension declarations with constraints because
those declarations already have the where clauses right before the body. In
that regard, the proposal makes the other declarations more consistent with
extension declarations.
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#detailed-design>Detailed
design
First of all, the grammar of generic-parameter-clause is modified to loose the
requirement- clause:
generic-parameter-clause → < generic-parameter-list >
The grammar of declarations are then amended to gain the requirement-clause:
function-declaration → function-head function-name
generic-parameter-clauseopt function-signature requirement-clauseopt
function-bodyopt
union-style-enum → indirectopt enum enum-name
generic-parameter-clauseopt type-inheritance-clauseopt
requirement-clauseopt { union-style-enum-membersopt }
raw-value-style-enum → enum enum-name generic-parameter-clauseopt
type-inheritance-clause requirement-clauseopt {
raw-value-style-enum-members *}*
struct-declaration → attributesopt access-level-modifieropt struct
struct-name generic-parameter-clauseopt type-inheritance-clauseopt
requirement-clauseopt struct-body
class-declaration → attributesopt access-level-modifieropt finalopt
class class-name generic-parameter-clauseopt type-inheritance-clauseopt
requirement-clauseopt class-body
protocol-method-declaration → function-head function-name
generic-parameter-clauseopt function-signature requirement-clauseopt
protocol-initializer-declaration → initializer-head
generic-parameter-clauseopt parameter-clause throwsopt
requirement-clauseopt
protocol-initializer-declaration → initializer-head
generic-parameter-clauseopt parameter-clause rethrows
requirement-clauseopt
initializer-declaration → initializer-head generic-parameter-clauseopt
parameter-clause throwsopt requirement-clauseopt initializer-body
initializer-declaration → initializer-head generic-parameter-clauseopt
parameter-clause rethrows requirement-clauseopt initializer-body
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#impact-on-existing-code>Impact
on existing code
This proposal impacts all declarations which contain where clauses expect for
extension declarations and will therefore require a Fix-It.
<https://github.com/hartbit/swift-evolution/blob/move-where-clause/proposals/XXXX-move-where-expression.md#alternatives-considered>Alternatives
considered
The first post in the swift-evolution thread originally proposed moving the
where clause just after the generic type declaration. Since then, the original
author and many other participants in the thread have agreed that the current
proposal is superior.
It was also proposed to remove the simple inheritance constraints from the
generic parameter list, but several arguments were brought up that it would
complicate declarations of simple generics which only needed inheritance
constraints._______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution