Skip to content

Commit d029f42

Browse files
authored
Merge pull request swiftlang#137 from google/initializers
Pretty print initializers.
2 parents 5d6ca8c + 8854354 commit d029f42

File tree

2 files changed

+328
-4
lines changed

2 files changed

+328
-4
lines changed

Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift

+30-4
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,36 @@ private final class TokenStreamCreator: SyntaxVisitor {
793793
super.visit(node)
794794
}
795795

796+
override func visit(_ node: InitializerDeclSyntax) {
797+
before(node.firstToken, tokens: .open(.inconsistent, 0))
798+
799+
if let attributes = node.attributes {
800+
before(node.firstToken, tokens: .space(size: 0), .open(.consistent, 0))
801+
after(attributes.lastToken, tokens: .open)
802+
} else {
803+
before(node.firstToken, tokens: .space(size: 0), .open(.consistent, 0), .open)
804+
}
805+
806+
before(
807+
node.genericWhereClause?.firstToken,
808+
tokens: .break, .open(.inconsistent, 0), .break(size: 0), .open(.consistent, 0)
809+
)
810+
after(node.genericWhereClause?.lastToken, tokens: .break, .close, .close)
811+
812+
before(node.throwsOrRethrowsKeyword, tokens: .break)
813+
814+
if let body = node.body {
815+
if node.genericWhereClause == nil {
816+
before(body.leftBrace, tokens: .break)
817+
}
818+
after(body.leftBrace, tokens: .close, .close, .break(offset: 2), .open(.consistent, 0))
819+
before(body.rightBrace, tokens: .break(offset: -2), .close)
820+
}
821+
822+
after(node.lastToken, tokens: .close)
823+
super.visit(node)
824+
}
825+
796826
override func visit(_ node: FunctionSignatureSyntax) {
797827
before(node.output?.firstToken, tokens: .break)
798828
super.visit(node)
@@ -986,10 +1016,6 @@ private final class TokenStreamCreator: SyntaxVisitor {
9861016
super.visit(node)
9871017
}
9881018

989-
override func visit(_ node: InitializerDeclSyntax) {
990-
super.visit(node)
991-
}
992-
9931019
override func visit(_ node: OptionalPatternSyntax) {
9941020
super.visit(node)
9951021
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
public class InitializerDeclTests: PrettyPrintTestCase {
2+
public func testBasicInitializerDeclarations() {
3+
let input =
4+
"""
5+
struct Struct {
6+
init(var1: Int, var2: Double) {
7+
print("Hello World")
8+
let a = 23
9+
}
10+
init(reallyLongLabelVar1: Int, var2: Double, var3: Bool) {
11+
print("Hello World")
12+
let a = 23
13+
}
14+
init() {
15+
let a = 23
16+
}
17+
init() { let a = "AAAA BBBB CCCC DDDD EEEE FFFF" }
18+
}
19+
"""
20+
21+
let expected =
22+
"""
23+
struct Struct {
24+
init(var1: Int, var2: Double) {
25+
print("Hello World")
26+
let a = 23
27+
}
28+
init(
29+
reallyLongLabelVar1: Int,
30+
var2: Double,
31+
var3: Bool
32+
) {
33+
print("Hello World")
34+
let a = 23
35+
}
36+
init() { let a = 23 }
37+
init() {
38+
let a = "AAAA BBBB CCCC DDDD EEEE FFFF"
39+
}
40+
}
41+
42+
"""
43+
44+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 50)
45+
}
46+
47+
public func testInitializerOptionality() {
48+
let input =
49+
"""
50+
struct Struct {
51+
init? (var1: Int, var2: Double) {
52+
print("Hello World")
53+
let a = 23
54+
}
55+
init! (reallyLongLabelVar1: Int, var2: Double, var3: Bool) {
56+
print("Hello World")
57+
let a = 23
58+
}
59+
init?() {
60+
let a = 23
61+
}
62+
init!() { let a = "AAAA BBBB CCCC DDDD EEEE FFFF" }
63+
}
64+
"""
65+
66+
let expected =
67+
"""
68+
struct Struct {
69+
init?(var1: Int, var2: Double) {
70+
print("Hello World")
71+
let a = 23
72+
}
73+
init!(
74+
reallyLongLabelVar1: Int,
75+
var2: Double,
76+
var3: Bool
77+
) {
78+
print("Hello World")
79+
let a = 23
80+
}
81+
init?() { let a = 23 }
82+
init!() {
83+
let a = "AAAA BBBB CCCC DDDD EEEE FFFF"
84+
}
85+
}
86+
87+
"""
88+
89+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 50)
90+
}
91+
92+
public func testInitializerDeclThrows() {
93+
let input =
94+
"""
95+
struct Struct {
96+
init(var1: Int, var2: Double) throws {
97+
print("Hello World")
98+
}
99+
init(reallyLongLabelVar1: Int, var2: Double, var3: Bool) throws {
100+
print("Hello World")
101+
}
102+
}
103+
"""
104+
105+
let expected =
106+
"""
107+
struct Struct {
108+
init(var1: Int, var2: Double) throws {
109+
print("Hello World")
110+
}
111+
init(
112+
reallyLongLabelVar1: Int,
113+
var2: Double,
114+
var3: Bool
115+
) throws { print("Hello World") }
116+
}
117+
118+
"""
119+
120+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 50)
121+
}
122+
123+
public func testInitializerGenericParameters() {
124+
let input =
125+
"""
126+
struct Struct {
127+
init<S, T>(var1: S, var2: T) {
128+
let a = 123
129+
print("Hello World")
130+
}
131+
132+
init<ReallyLongTypeName: Conform, TypeName>(var1: ReallyLongTypeName, var2: TypeName) {
133+
let a = 123
134+
let b = 456
135+
}
136+
}
137+
"""
138+
139+
let expected =
140+
"""
141+
struct Struct {
142+
init<S, T>(var1: S, var2: T) {
143+
let a = 123
144+
print("Hello World")
145+
}
146+
147+
init<
148+
ReallyLongTypeName: Conform,
149+
TypeName
150+
>(
151+
var1: ReallyLongTypeName,
152+
var2: TypeName
153+
) {
154+
let a = 123
155+
let b = 456
156+
}
157+
}
158+
159+
"""
160+
161+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 40)
162+
}
163+
164+
public func testInitializerWhereClause() {
165+
let input =
166+
"""
167+
struct Struct {
168+
public init<Elements: Collection, Element>(
169+
element: Element,
170+
in collection: Elements
171+
) where Elements.Element == Element {
172+
let a = 123
173+
let b = "abc"
174+
}
175+
176+
public init<Elements: Collection, Element>(
177+
element: Element,
178+
in collection: Elements
179+
) where Elements.Element == Element, Element: Equatable {
180+
let a = 123
181+
let b = "abc"
182+
}
183+
}
184+
"""
185+
186+
let expected =
187+
"""
188+
struct Struct {
189+
public init<Elements: Collection, Element>(
190+
element: Element,
191+
in collection: Elements
192+
) where Elements.Element == Element {
193+
let a = 123
194+
let b = "abc"
195+
}
196+
197+
public init<Elements: Collection, Element>(
198+
element: Element,
199+
in collection: Elements
200+
)
201+
where
202+
Elements.Element == Element,
203+
Element: Equatable
204+
{
205+
let a = 123
206+
let b = "abc"
207+
}
208+
}
209+
210+
"""
211+
212+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 50)
213+
}
214+
215+
public func testInitializerAttributes() {
216+
let input =
217+
"""
218+
struct Struct {
219+
@objc public init() {
220+
let a = 123
221+
let b = "abc"
222+
}
223+
@objc @inlinable public init() {
224+
let a = 123
225+
let b = "abc"
226+
}
227+
@objc @available(swift 4.0) public init() {
228+
let a = 123
229+
let b = "abc"
230+
}
231+
}
232+
"""
233+
234+
let expected =
235+
"""
236+
struct Struct {
237+
@objc public init() {
238+
let a = 123
239+
let b = "abc"
240+
}
241+
@objc
242+
@inlinable
243+
public init() {
244+
let a = 123
245+
let b = "abc"
246+
}
247+
@objc
248+
@available(swift 4.0)
249+
public init() {
250+
let a = 123
251+
let b = "abc"
252+
}
253+
}
254+
255+
"""
256+
257+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 30)
258+
}
259+
260+
261+
public func testInitializerFullWrap() {
262+
let input =
263+
"""
264+
struct Struct {
265+
@objc @inlinable
266+
public init<Elements: Collection, Element>(element: Element, in collection: Elements) where Elements.Element == Element, Element: Equatable {
267+
let a = 123
268+
let b = "abc"
269+
}
270+
}
271+
"""
272+
273+
let expected =
274+
"""
275+
struct Struct {
276+
@objc
277+
@inlinable
278+
public init<
279+
Elements: Collection,
280+
Element
281+
>(
282+
element: Element,
283+
in collection: Elements
284+
)
285+
where
286+
Elements.Element == Element,
287+
Element: Equatable
288+
{
289+
let a = 123
290+
let b = "abc"
291+
}
292+
}
293+
294+
"""
295+
296+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 40)
297+
}
298+
}

0 commit comments

Comments
 (0)