Skip to content

Commit 67e1ced

Browse files
committed
Remove the break stack, and update the exisiting visitors.
1 parent 7d5ae9f commit 67e1ced

File tree

3 files changed

+41
-42
lines changed

3 files changed

+41
-42
lines changed

Sources/PrettyPrint/PrettyPrint.swift

+15-16
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,15 @@ public class PrettyPrinter {
4747
// Did the previous token trigger a newline?
4848
private var lastBreak = false
4949

50+
// What is the offset value of the last triggering break?
5051
private var lastBreakOffset = 0
5152

53+
// What is the total number of spaces we need to indent from the last break?
54+
private var lastBreakValue = 0
55+
5256
// Keep track of the indentation level of the current group as the number of blank spaces.
5357
private var indentStack = [0]
5458

55-
// The first token of a group must be indented according to it's outer group. Use this stack when
56-
// printing the indent of the first token in a group. Subsequent tokens will use the indent of the
57-
// current group.
58-
private var breakStack = [0]
59-
6059
// Do we force breaks (for consistent breaking) within the current group?
6160
private var forceBreakStack = [false]
6261

@@ -112,9 +111,7 @@ public class PrettyPrinter {
112111
}
113112

114113
let indentValue = indentStack.last ?? 0
115-
let breakValue = breakStack.last ?? 0
116114
indentStack.append(indentValue + offset + lastBreakOffset)
117-
breakStack.append(breakValue)
118115
lastBreakOffset = 0
119116

120117
case .close:
@@ -123,7 +120,6 @@ public class PrettyPrinter {
123120
}
124121
forceBreakStack.removeLast()
125122
indentStack.removeLast()
126-
breakStack.removeLast()
127123

128124
case .break(let size, let offset):
129125
if isDebugMode {
@@ -138,38 +134,41 @@ public class PrettyPrinter {
138134
if length > spaceRemaining || forcebreak {
139135
// Update the top of the breakStack to reflect the indentation level of the current group.
140136
let indentValue = indentStack.last ?? 0
141-
breakStack.removeLast()
142-
breakStack.append(indentValue + offset)
143137

144138
spaceRemaining = maxLineLength - indentValue - offset
145139
write("\n")
140+
146141
lastBreak = true
147142
lastBreakOffset = offset
143+
lastBreakValue = indentValue + offset
148144
} else {
149145
writeSpaces(size)
150146
spaceRemaining -= size
147+
151148
lastBreak = false
152149
lastBreakOffset = 0
150+
lastBreakValue = 0
153151
}
154152

155153
case .newlines(let N, let offset):
156154
// Newlines are treated as forced `breaks` with a size of zero.
157155
let indentValue = indentStack.last ?? 0
158-
breakStack.removeLast()
159-
breakStack.append(indentValue + offset)
160156

161157
spaceRemaining = maxLineLength - indentValue - offset
162158
write(String(repeating: "\n", count: N))
159+
163160
lastBreak = true
164161
lastBreakOffset = offset
165-
162+
lastBreakValue = indentValue + offset
166163

167164
case .syntax(let syntaxToken):
168165
if lastBreak {
169-
// If the last token created a newline, we need to apply indentation.
170-
let indentValue = breakStack.last ?? 0
171-
writeSpaces(indentValue)
166+
// If the last token created a new line, we need to apply indentation.
167+
writeSpaces(lastBreakValue)
168+
172169
lastBreak = false
170+
lastBreakOffset = 0
171+
lastBreakValue = 0
173172
}
174173
write(syntaxToken.text)
175174
spaceRemaining -= syntaxToken.text.count

Sources/PrettyPrint/TokenStreamCreator.swift

+24-24
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,15 @@ private final class TokenStreamCreator: SyntaxVisitor {
169169
}
170170

171171
override func visit(_ node: ParameterClauseSyntax) {
172-
after(node.leftParen, tokens: .break(size: 0), .open(.consistent, 0))
173-
before(node.rightParen, tokens: .close)
172+
after(node.leftParen, tokens: .break(size: 0, offset: 2), .open(.consistent, 0))
173+
before(node.rightParen, tokens: .break(size: 0, offset: -2), .close)
174174
super.visit(node)
175175
}
176176

177177
override func visit(_ node: ReturnClauseSyntax) {
178+
before(node.firstToken, tokens: .open)
179+
before(node.returnType.firstToken, tokens: .break)
180+
after(node.lastToken, tokens: .close)
178181
super.visit(node)
179182
}
180183

@@ -260,6 +263,16 @@ private final class TokenStreamCreator: SyntaxVisitor {
260263
}
261264

262265
override func visit(_ node: CodeBlockSyntax) {
266+
for i in 0..<(node.statements.count - 1) {
267+
after(node.statements[i].lastToken, tokens: .newline)
268+
}
269+
super.visit(node)
270+
}
271+
272+
override func visit(_ node: CodeBlockItemSyntax) {
273+
if !(node.parent?.parent is CodeBlockSyntax) {
274+
after(node.lastToken, tokens: .newline)
275+
}
263276
super.visit(node)
264277
}
265278

@@ -315,17 +328,17 @@ private final class TokenStreamCreator: SyntaxVisitor {
315328
override func visit(_ node: IfStmtSyntax) {
316329
before(node.ifKeyword, tokens: .open(.inconsistent, 3))
317330
after(node.ifKeyword, tokens: .break)
318-
before(node.body.leftBrace, tokens: .break, .close)
331+
before(node.body.leftBrace, tokens: .break(offset: -3), .close)
319332

320-
after(node.body.leftBrace, tokens: .open(.consistent, 2), .newline)
321-
before(node.body.rightBrace, tokens: .close)
333+
after(node.body.leftBrace, tokens: .newline(offset: 2), .open(.consistent, 0))
334+
before(node.body.rightBrace, tokens: .newline(offset: -2), .close)
322335

323336
before(node.elseKeyword, tokens: .break)
324337
after(node.elseKeyword, tokens: .break)
325338

326339
if let elseBody = node.elseBody as? CodeBlockSyntax {
327-
after(elseBody.leftBrace, tokens: .open(.consistent, 2), .newline)
328-
before(elseBody.rightBrace, tokens: .close)
340+
after(elseBody.leftBrace, tokens: .newline(offset: 2), .open(.consistent, 0))
341+
before(elseBody.rightBrace, tokens: .newline(offset: -2), .close)
329342
}
330343
super.visit(node)
331344
}
@@ -395,7 +408,9 @@ private final class TokenStreamCreator: SyntaxVisitor {
395408
}
396409

397410
override func visit(_ node: ReturnStmtSyntax) {
411+
before(node.firstToken, tokens: .open)
398412
after(node.returnKeyword, tokens: .break)
413+
after(node.lastToken, tokens: .close)
399414
super.visit(node)
400415
}
401416

@@ -448,30 +463,20 @@ private final class TokenStreamCreator: SyntaxVisitor {
448463
}
449464

450465
override func visit(_ node: FunctionDeclSyntax) {
451-
//if let token = node.firstToken {
452-
// before(token, tokens: .open(.inconsistent, 2))
453-
//}
454-
//before(node.signature.input.rightParen, tokens: .break(size: 0), .close)
455466
after(node.modifiers?.lastToken, tokens: .break)
456467
after(node.funcKeyword, tokens: .break)
457468

458469
if let body = node.body {
459470
before(body.leftBrace, tokens: .break)
460471
after(body.leftBrace, tokens: .newline(offset: 2), .open(.consistent, 0))
461-
before(body.rightBrace, tokens: .close)
472+
before(body.rightBrace, tokens: .newline(offset: -2), .close)
462473
}
463474

464475
super.visit(node)
465476
}
466477

467478
override func visit(_ node: FunctionSignatureSyntax) {
468-
if node.output != nil {
469-
after(node.input.rightParen, tokens: .break)
470-
}
471-
before(node.output?.arrow, tokens: .open(.consistent, 2))
472-
after(node.output?.arrow, tokens: .break)
473-
after(node.output?.returnType.lastToken, tokens: .close)
474-
479+
before(node.output?.firstToken, tokens: .break)
475480
super.visit(node)
476481
}
477482

@@ -513,11 +518,6 @@ private final class TokenStreamCreator: SyntaxVisitor {
513518
super.visit(node)
514519
}
515520

516-
override func visit(_ node: CodeBlockItemSyntax) {
517-
after(node.lastToken, tokens: .newline)
518-
super.visit(node)
519-
}
520-
521521
override func visit(_ node: ExtensionDeclSyntax) {
522522
super.visit(node)
523523
}

Tests/PrettyPrinterTests/IfStmtTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ public class IfStmtTests: PrettyPrintTestCase {
8888
8989
if var1 < var2 {
9090
let a = 23
91-
} else if var3 <
92-
var4 {
91+
} else
92+
if var3 < var4 {
9393
var b = 123
9494
}
9595

0 commit comments

Comments
 (0)