Skip to content

Commit 6da2f97

Browse files
authored
Merge pull request swiftlang#127 from dabelknap/protocols
Support protocol declarations
2 parents 339cd21 + 01ab797 commit 6da2f97

File tree

2 files changed

+177
-8
lines changed

2 files changed

+177
-8
lines changed

Sources/PrettyPrint/TokenStreamCreator.swift

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,23 @@ private final class TokenStreamCreator: SyntaxVisitor {
363363
super.visit(node)
364364
}
365365

366+
override func visit(_ node: AccessorDeclSyntax) {
367+
super.visit(node)
368+
}
369+
370+
override func visit(_ node: AccessorBlockSyntax) {
371+
after(node.leftBrace, tokens: .break(offset: 2), .open(.consistent, 0))
372+
before(node.rightBrace, tokens: .break(offset: -2), .close)
373+
super.visit(node)
374+
}
375+
376+
override func visit(_ node: AccessorListSyntax) {
377+
if node.count > 1 {
378+
after(node.first?.lastToken, tokens: .break)
379+
}
380+
super.visit(node)
381+
}
382+
366383
func shouldAddOpenCloseNewlines(_ node: Syntax) -> Bool {
367384
if node is AccessorListSyntax { return true }
368385
guard let list = node as? CodeBlockItemListSyntax else {
@@ -372,10 +389,6 @@ private final class TokenStreamCreator: SyntaxVisitor {
372389
return FindChildScope().findChildScope(in: list)
373390
}
374391

375-
override func visit(_ node: AccessorBlockSyntax) {
376-
super.visit(node)
377-
}
378-
379392
override func visit(_ node: CodeBlockSyntax) {
380393
for i in 0..<(node.statements.count - 1) {
381394
after(node.statements[i].lastToken, tokens: .newline)
@@ -704,10 +717,6 @@ private final class TokenStreamCreator: SyntaxVisitor {
704717
super.visit(node)
705718
}
706719

707-
override func visit(_ node: AccessorDeclSyntax) {
708-
super.visit(node)
709-
}
710-
711720
override func visit(_ node: ArrayElementSyntax) {
712721
before(node.firstToken, tokens: .open)
713722
if let trailingComma = node.trailingComma {
@@ -768,6 +777,21 @@ private final class TokenStreamCreator: SyntaxVisitor {
768777
}
769778

770779
override func visit(_ node: ProtocolDeclSyntax) {
780+
if let attributes = node.attributes {
781+
before(node.firstToken, tokens: .space(size: 0), .open(.consistent, 0))
782+
after(attributes.lastToken, tokens: .open)
783+
} else {
784+
before(node.firstToken, tokens: .space(size: 0), .open(.consistent, 0), .open)
785+
}
786+
787+
after(node.protocolKeyword, tokens: .break)
788+
before(node.members.leftBrace, tokens: .break)
789+
after(
790+
node.members.leftBrace,
791+
tokens: .close, .close, .break(size: 0, offset: 2), .open(.consistent, 0)
792+
)
793+
before(node.members.rightBrace, tokens: .break(size: 0, offset: -2), .close)
794+
771795
super.visit(node)
772796
}
773797

@@ -880,6 +904,7 @@ private final class TokenStreamCreator: SyntaxVisitor {
880904
}
881905

882906
override func visit(_ node: PatternBindingSyntax) {
907+
before(node.accessor?.firstToken, tokens: .break)
883908
super.visit(node)
884909
}
885910

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
public class ProtocolDeclTests: PrettyPrintTestCase {
2+
public func testBasicProtocolDeclarations() {
3+
let input =
4+
"""
5+
protocol MyProtocol {
6+
var A: Int { get set }
7+
var B: Bool { get }
8+
}
9+
protocol MyProtocol {
10+
var VeryLongVariable: Int { get set }
11+
var B: Bool { get }
12+
}
13+
public protocol MyProtocol {
14+
var A: Int { get set }
15+
var B: Bool { get }
16+
}
17+
public protocol MyLongerProtocol {
18+
var A: Int { get set }
19+
var B: Bool { get }
20+
}
21+
"""
22+
23+
let expected =
24+
"""
25+
protocol MyProtocol {
26+
var A: Int { get set }
27+
var B: Bool { get }
28+
}
29+
protocol MyProtocol {
30+
var VeryLongVariable: Int {
31+
get
32+
set
33+
}
34+
var B: Bool { get }
35+
}
36+
public protocol MyProtocol {
37+
var A: Int { get set }
38+
var B: Bool { get }
39+
}
40+
public protocol
41+
MyLongerProtocol {
42+
var A: Int { get set }
43+
var B: Bool { get }
44+
}
45+
46+
"""
47+
48+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 30)
49+
}
50+
51+
public func testProtocolInheritence() {
52+
let input =
53+
"""
54+
protocol MyProtocol: ProtoOne {
55+
var A: Int { get set }
56+
var B: Bool { get }
57+
}
58+
protocol MyProtocol: ProtoOne, ProtoTwo {
59+
var A: Int { get set }
60+
var B: Bool { get }
61+
}
62+
protocol MyProtocol: ProtoOne, ProtoTwo, ProtoThree {
63+
var A: Int { get set }
64+
var B: Bool { get }
65+
}
66+
"""
67+
68+
let expected =
69+
"""
70+
protocol MyProtocol: ProtoOne {
71+
var A: Int { get set }
72+
var B: Bool { get }
73+
}
74+
protocol MyProtocol: ProtoOne, ProtoTwo {
75+
var A: Int { get set }
76+
var B: Bool { get }
77+
}
78+
protocol MyProtocol:
79+
ProtoOne,
80+
ProtoTwo,
81+
ProtoThree
82+
{
83+
var A: Int { get set }
84+
var B: Bool { get }
85+
}
86+
87+
"""
88+
89+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 50)
90+
}
91+
92+
93+
public func testProtocolAttributes() {
94+
let input =
95+
"""
96+
@dynamicMemberLookup public protocol MyProtocol {
97+
var A: Int { get set }
98+
var B: Double { get }
99+
}
100+
@dynamicMemberLookup @objc public protocol MyProtocol {
101+
var A: Int { get set }
102+
var B: Double { get }
103+
}
104+
@dynamicMemberLookup @objc @objcMembers public protocol MyProtocol {
105+
var A: Int { get set }
106+
var B: Double { get }
107+
}
108+
@dynamicMemberLookup
109+
@available(swift 4.0)
110+
public protocol MyProtocol {
111+
var A: Int { get set }
112+
var B: Double { get }
113+
}
114+
"""
115+
116+
let expected =
117+
"""
118+
@dynamicMemberLookup public protocol MyProtocol {
119+
var A: Int { get set }
120+
var B: Double { get }
121+
}
122+
@dynamicMemberLookup @objc public protocol MyProtocol {
123+
var A: Int { get set }
124+
var B: Double { get }
125+
}
126+
@dynamicMemberLookup
127+
@objc
128+
@objcMembers
129+
public protocol MyProtocol {
130+
var A: Int { get set }
131+
var B: Double { get }
132+
}
133+
@dynamicMemberLookup
134+
@available(swift 4.0)
135+
public protocol MyProtocol {
136+
var A: Int { get set }
137+
var B: Double { get }
138+
}
139+
140+
"""
141+
142+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 60)
143+
}
144+
}

0 commit comments

Comments
 (0)