From 4241376379993e0d4713df80d6c37973ed202440 Mon Sep 17 00:00:00 2001 From: Kishikawa Katsumi Date: Wed, 12 Apr 2023 15:46:36 +0900 Subject: [PATCH] =?UTF-8?q?Fix=20escape=20handling=20to=20include=20the=20?= =?UTF-8?q?emoji=20`#=EF=B8=8F=E2=83=A3`=20when=20counting=20`#`=20charact?= =?UTF-8?q?ers=20in=20string=20literals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift | 2 +- Tests/SwiftSyntaxBuilderTest/StringLiteralTests.swift | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift b/Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift index 745f9e8a545..0d1335fd36e 100644 --- a/Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift +++ b/Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift @@ -249,7 +249,7 @@ extension StringLiteralExprSyntax { continue // Special mode: counting a sequence of pounds until we reach its end. - case (true, "#"): + case (true, _) where c.unicodeScalars.contains("#"): consecutivePounds += 1 maxPounds = max(maxPounds, consecutivePounds) case (true, _): diff --git a/Tests/SwiftSyntaxBuilderTest/StringLiteralTests.swift b/Tests/SwiftSyntaxBuilderTest/StringLiteralTests.swift index 2311fbcd50a..76da43a3cf3 100644 --- a/Tests/SwiftSyntaxBuilderTest/StringLiteralTests.swift +++ b/Tests/SwiftSyntaxBuilderTest/StringLiteralTests.swift @@ -71,6 +71,15 @@ final class StringLiteralTests: XCTestCase { ) } + func testEscapePoundEmojis() { + assertBuildResult( + StringLiteralExprSyntax(content: ##"foo"#️⃣"bar"##), + """ + ##"foo"#️⃣"bar"## + """ + ) + } + func testEscapeInteropolation() { assertBuildResult( StringLiteralExprSyntax(content: ###"\##(foobar)\#(foobar)"###),