@@ -44,62 +44,29 @@ public final class OmitReturns: SyntaxFormatRule {
44
44
return decl
45
45
}
46
46
47
- if let accessorBlock = `subscript`. accessorBlock {
48
- // We are assuming valid Swift code here where only
49
- // one `get { ... }` is allowed.
50
- switch accessorBlock. accessors {
51
- case . accessors( let accessors) :
52
- guard var getter = accessors. filter ( {
53
- $0. accessorSpecifier. tokenKind == . keyword( . get)
54
- } ) . first else {
55
- return decl
56
- }
57
-
58
- guard let body = getter. body,
59
- let `return` = containsSingleReturn ( body. statements) else {
60
- return decl
61
- }
62
-
63
- guard let getterAt = accessors. firstIndex ( where: {
64
- $0. accessorSpecifier. tokenKind == . keyword( . get)
65
- } ) else {
66
- return decl
67
- }
68
-
69
- getter. body? . statements = unwrapReturnStmt ( `return`)
70
-
71
- `subscript`. accessorBlock = . init(
72
- leadingTrivia: accessorBlock. leadingTrivia,
73
- leftBrace: accessorBlock. leftBrace,
74
- accessors: . accessors( accessors. with ( \. [ getterAt] , getter) ) ,
75
- rightBrace: accessorBlock. rightBrace,
76
- trailingTrivia: accessorBlock. trailingTrivia)
77
-
78
- diagnose ( . omitReturnStatement, on: `return`, severity: . refactoring)
79
-
80
- return DeclSyntax ( `subscript`)
81
-
82
- case . getter( let getter) :
83
- guard let `return` = containsSingleReturn ( getter) else {
84
- return decl
85
- }
86
-
87
- `subscript`. accessorBlock = . init(
88
- leadingTrivia: accessorBlock. leadingTrivia,
89
- leftBrace: accessorBlock. leftBrace,
90
- accessors: . getter( unwrapReturnStmt ( `return`) ) ,
91
- rightBrace: accessorBlock. rightBrace,
92
- trailingTrivia: accessorBlock. trailingTrivia)
93
-
94
- diagnose ( . omitReturnStatement, on: `return`, severity: . refactoring)
95
-
96
- return DeclSyntax ( `subscript`)
97
- }
47
+ if let accessorBlock = `subscript`. accessorBlock,
48
+ // We are assuming valid Swift code here where only
49
+ // one `get { ... }` is allowed.
50
+ let transformed = transformAccessorBlock ( accessorBlock) {
51
+ `subscript`. accessorBlock = transformed
52
+ return DeclSyntax ( `subscript`)
98
53
}
99
54
100
55
return decl
101
56
}
102
57
58
+ public override func visit( _ node: PatternBindingSyntax ) -> PatternBindingSyntax {
59
+ var binding = node
60
+
61
+ if let accessorBlock = binding. accessorBlock,
62
+ let transformed = transformAccessorBlock ( accessorBlock) {
63
+ binding. accessorBlock = transformed
64
+ return binding
65
+ }
66
+
67
+ return node
68
+ }
69
+
103
70
public override func visit( _ node: ClosureExprSyntax ) -> ExprSyntax {
104
71
let expr = super. visit ( node)
105
72
@@ -114,6 +81,55 @@ public final class OmitReturns: SyntaxFormatRule {
114
81
return expr
115
82
}
116
83
84
+ private func transformAccessorBlock( _ accessorBlock: AccessorBlockSyntax ) -> AccessorBlockSyntax ? {
85
+ // We are assuming valid Swift code here where only
86
+ // one `get { ... }` is allowed.
87
+ switch accessorBlock. accessors {
88
+ case . accessors( let accessors) :
89
+ guard var getter = accessors. filter ( {
90
+ $0. accessorSpecifier. tokenKind == . keyword( . get)
91
+ } ) . first else {
92
+ return nil
93
+ }
94
+
95
+ guard let body = getter. body,
96
+ let `return` = containsSingleReturn ( body. statements) else {
97
+ return nil
98
+ }
99
+
100
+ guard let getterAt = accessors. firstIndex ( where: {
101
+ $0. accessorSpecifier. tokenKind == . keyword( . get)
102
+ } ) else {
103
+ return nil
104
+ }
105
+
106
+ getter. body? . statements = unwrapReturnStmt ( `return`)
107
+
108
+ diagnose ( . omitReturnStatement, on: `return`, severity: . refactoring)
109
+
110
+ return . init(
111
+ leadingTrivia: accessorBlock. leadingTrivia,
112
+ leftBrace: accessorBlock. leftBrace,
113
+ accessors: . accessors( accessors. with ( \. [ getterAt] , getter) ) ,
114
+ rightBrace: accessorBlock. rightBrace,
115
+ trailingTrivia: accessorBlock. trailingTrivia)
116
+
117
+ case . getter( let getter) :
118
+ guard let `return` = containsSingleReturn ( getter) else {
119
+ return nil
120
+ }
121
+
122
+ diagnose ( . omitReturnStatement, on: `return`, severity: . refactoring)
123
+
124
+ return . init(
125
+ leadingTrivia: accessorBlock. leadingTrivia,
126
+ leftBrace: accessorBlock. leftBrace,
127
+ accessors: . getter( unwrapReturnStmt ( `return`) ) ,
128
+ rightBrace: accessorBlock. rightBrace,
129
+ trailingTrivia: accessorBlock. trailingTrivia)
130
+ }
131
+ }
132
+
117
133
private func containsSingleReturn( _ body: CodeBlockItemListSyntax ) -> ReturnStmtSyntax ? {
118
134
if let element = body. firstAndOnly? . as ( CodeBlockItemSyntax . self) ,
119
135
let ret = element. item. as ( ReturnStmtSyntax . self) ,
0 commit comments