Skip to content

Commit 0dae896

Browse files
authored
Merge pull request #59669 from WANGJIEKE/cxx-interop-enum-cases-class
[Interop][SwiftToCxx] Emit helper cases class in C++ for Swift enum
2 parents 4b45d91 + 7c962b2 commit 0dae896

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,20 @@ class DeclAndTypePrinter::Implementation
392392
ClangValueTypePrinter printer(os, owningPrinter.prologueOS,
393393
owningPrinter.typeMapping,
394394
owningPrinter.interopContext);
395-
printer.printValueTypeDecl(
396-
ED, /*bodyPrinter=*/[&]() {}); // TODO: (tongjie) print cases
395+
printer.printValueTypeDecl(ED, /*bodyPrinter=*/[&]() {
396+
ClangSyntaxPrinter syntaxPrinter(os);
397+
os << " enum class cases {";
398+
llvm::interleaveComma(
399+
ED->getAllCases(), os, [&](const EnumCaseDecl *caseDecl) {
400+
llvm::interleaveComma(caseDecl->getElements(), os,
401+
[&](const EnumElementDecl *elementDecl) {
402+
os << "\n ";
403+
syntaxPrinter.printIdentifier(
404+
elementDecl->getNameStr());
405+
});
406+
});
407+
os << "\n };\n";
408+
});
397409
os << outOfLineDefinitions;
398410
outOfLineDefinitions.clear();
399411
return;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend %s -typecheck -module-name Enums -clang-header-expose-public-decls -emit-clang-header-path %t/enums.h
3+
// RUN: %FileCheck %s < %t/enums.h
4+
5+
// RUN: %check-interop-cxx-header-in-clang(%t/enums.h -Wno-unused-private-field -Wno-unused-function)
6+
7+
public enum EnumMultipleElementsInSingleCase { case first, second }
8+
9+
public enum EnumSingleElementInSingleCase {
10+
case first
11+
case second
12+
}
13+
14+
public enum EnumCaseIsSwiftKeyword {
15+
case first(a: Int)
16+
case `protocol`(b: Double)
17+
}
18+
19+
public enum EnumCaseIsCxxKeyword {
20+
case first, second(x: Float)
21+
case const
22+
}
23+
24+
// CHECK: class EnumCaseIsCxxKeyword final {
25+
// CHECK: enum class cases {
26+
// CHECK-NEXT: first,
27+
// CHECK-NEXT: second,
28+
// CHECK-NEXT: const_
29+
// CHECK-NEXT: };
30+
31+
// CHECK: class EnumCaseIsSwiftKeyword final {
32+
// CHECK: enum class cases {
33+
// CHECK-NEXT: first,
34+
// CHECK-NEXT: protocol
35+
// CHECK-NEXT: };
36+
37+
// CHECK: class EnumMultipleElementsInSingleCase final {
38+
// CHECK: enum class cases {
39+
// CHECK-NEXT: first,
40+
// CHECK-NEXT: second
41+
// CHECK-NEXT: };
42+
43+
// CHECK: class EnumSingleElementInSingleCase final {
44+
// CHECK: enum class cases {
45+
// CHECK-NEXT: first,
46+
// CHECK-NEXT: second
47+
// CHECK-NEXT: };

0 commit comments

Comments
 (0)