Skip to content

Commit 832edd1

Browse files
authored
Merge pull request swiftlang#16746 from johnfairh/enum-unistring
[ASTPrinter] Fix raw string enum cases with unicode scalars
2 parents c239420 + 32b04b8 commit 832edd1

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "swift/AST/Types.h"
3333
#include "swift/Basic/Defer.h"
3434
#include "swift/Basic/PrimitiveParsing.h"
35+
#include "swift/Basic/QuotedString.h"
3536
#include "swift/Basic/STLExtras.h"
3637
#include "swift/Basic/StringExtras.h"
3738
#include "swift/Config.h"
@@ -2587,11 +2588,15 @@ void PrintAST::printEnumElement(EnumElementDecl *elt) {
25872588
Printer.printStructurePost(PrintStructureKind::NumberLiteral);
25882589
break;
25892590
}
2590-
case ExprKind::StringLiteral:
2591+
case ExprKind::StringLiteral: {
25912592
Printer.callPrintStructurePre(PrintStructureKind::StringLiteral);
2592-
Printer << "\"" << cast<StringLiteralExpr>(raw)->getValue() << "\"";
2593+
llvm::SmallString<32> str;
2594+
llvm::raw_svector_ostream os(str);
2595+
os << QuotedString(cast<StringLiteralExpr>(raw)->getValue());
2596+
Printer << str;
25932597
Printer.printStructurePost(PrintStructureKind::StringLiteral);
25942598
break;
2599+
}
25952600
default:
25962601
break; // Incorrect raw value; skip it for error recovery.
25972602
}

test/SourceKit/CursorInfo/cursor_info.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ typealias typeWithNestedAutoclosure = (@autoclosure () -> ()) -> ()
222222

223223
typealias GenericAlias<T, U> = MyAlias<T, U> where T: P1
224224

225+
enum E7: String {
226+
case a = "\u{001B}"
227+
case b = "\u{66}"
228+
}
229+
225230
// REQUIRES: objc_interop
226231
// RUN: %empty-directory(%t.tmp)
227232
// RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift
@@ -752,3 +757,11 @@ typealias GenericAlias<T, U> = MyAlias<T, U> where T: P1
752757
// RUN: %sourcekitd-test -req=cursor -pos=223:11 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK91 %s
753758
// CHECK91: <Declaration>typealias GenericAlias&lt;T, U&gt; = <Type usr="s:11cursor_info7MyAliasa">MyAlias</Type>&lt;<Type usr="s:11cursor_info12GenericAliasa1Txmfp">T</Type>, <Type usr="s:11cursor_info12GenericAliasa1Uq_mfp">U</Type>&gt; where T : <Type usr="s:11cursor_info2P1P">P1</Type></Declaration>
754759
// CHECK91-NEXT: <decl.typealias><syntaxtype.keyword>typealias</syntaxtype.keyword> <decl.name>GenericAlias</decl.name>&lt;<decl.generic_type_param usr="s:11cursor_info12GenericAliasa1Txmfp"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="s:11cursor_info12GenericAliasa1Uq_mfp"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt; = <ref.typealias usr="s:11cursor_info7MyAliasa">MyAlias</ref.typealias>&lt;<ref.generic_type_param usr="s:11cursor_info12GenericAliasa1Txmfp">T</ref.generic_type_param>, <ref.generic_type_param usr="s:11cursor_info12GenericAliasa1Uq_mfp">U</ref.generic_type_param>&gt; <syntaxtype.keyword>where</syntaxtype.keyword> <decl.generic_type_requirement>T : <ref.protocol usr="s:11cursor_info2P1P">P1</ref.protocol></decl.generic_type_requirement></decl.typealias>
760+
761+
// RUN: %sourcekitd-test -req=cursor -pos=226:10 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK92 %s
762+
// CHECK92: <Declaration>case a = &quot;\u{1B}&quot;</Declaration>
763+
// CHECK92-NEXT: <decl.enumelement><syntaxtype.keyword>case</syntaxtype.keyword> <decl.name>a</decl.name> = <syntaxtype.string>&quot;\u{1B}&quot;</syntaxtype.string></decl.enumelement>
764+
765+
// RUN: %sourcekitd-test -req=cursor -pos=227:10 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK93 %s
766+
// CHECK93: <Declaration>case b = &quot;f&quot;</Declaration>
767+
// CHECK93-NEXT: <decl.enumelement><syntaxtype.keyword>case</syntaxtype.keyword> <decl.name>b</decl.name> = <syntaxtype.string>&quot;f&quot;</syntaxtype.string></decl.enumelement>

0 commit comments

Comments
 (0)