From 36aab0ae0d113217fdee6611ce60185996ef81c2 Mon Sep 17 00:00:00 2001 From: Tony Allevato Date: Wed, 28 Jun 2023 16:23:51 -0400 Subject: [PATCH] Fix indentation of multiline strings in enum case raw values. --- .../TokenStreamCreator.swift | 23 ++++++++++++++++++- .../StringTests.swift | 11 +++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift b/Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift index 8ab28b48..89cd415f 100644 --- a/Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift +++ b/Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift @@ -1556,6 +1556,26 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor { arrangeEnumCaseParameterClause(associatedValue, forcesBreakBeforeRightParen: false) } + if let initializer = node.rawValue { + if let (unindentingNode, _, breakKind, shouldGroup) = + stackedIndentationBehavior(rhs: initializer.value) + { + var openTokens: [Token] = [.break(.open(kind: breakKind))] + if shouldGroup { + openTokens.append(.open) + } + after(initializer.equal, tokens: openTokens) + + var closeTokens: [Token] = [.break(.close(mustBreak: false), size: 0)] + if shouldGroup { + closeTokens.append(.close) + } + after(unindentingNode.lastToken(viewMode: .sourceAccurate), tokens: closeTokens) + } else { + after(initializer.equal, tokens: .break(.continue)) + } + } + return .visitChildren } @@ -2303,12 +2323,13 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor { override func visit(_ node: InitializerClauseSyntax) -> SyntaxVisitorContinueKind { before(node.equal, tokens: .space) - // InitializerClauses that are children of a PatternBindingSyntax or + // InitializerClauses that are children of a PatternBindingSyntax, EnumCaseElementSyntax, or // OptionalBindingConditionSyntax are already handled in the latter node, to ensure that // continuations stack appropriately. if let parent = node.parent, !parent.is(PatternBindingSyntax.self) && !parent.is(OptionalBindingConditionSyntax.self) + && !parent.is(EnumCaseElementSyntax.self) { after(node.equal, tokens: .break) } diff --git a/Tests/SwiftFormatPrettyPrintTests/StringTests.swift b/Tests/SwiftFormatPrettyPrintTests/StringTests.swift index d82aba30..a9cc75f9 100644 --- a/Tests/SwiftFormatPrettyPrintTests/StringTests.swift +++ b/Tests/SwiftFormatPrettyPrintTests/StringTests.swift @@ -419,6 +419,17 @@ final class StringTests: PrettyPrintTestCase { assertPrettyPrintEqual(input: input, expected: input + "\n", linelength: 100) } + func testMultilineStringsAsEnumRawValues() { + let input = #""" + enum E: String { + case x = """ + blah blah + """ + } + """# + assertPrettyPrintEqual(input: input, expected: input + "\n", linelength: 100) + } + func testMultilineStringsNestedInAnotherWrappingContext() { let input = #"""