Skip to content

Commit b98bb6a

Browse files
committed
[Interop][SwiftToCxx] emit helper cases class in C++ for Swift enum
1 parent 15acfa9 commit b98bb6a

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-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(
401+
caseDecl->getElements(), os,
402+
[&](const EnumElementDecl *elementDecl) {
403+
syntaxPrinter.printIdentifier(
404+
elementDecl->getBaseIdentifier().str());
405+
});
406+
});
407+
os << " };\n";
408+
});
397409
os << outOfLineDefinitions;
398410
outOfLineDefinitions.clear();
399411
return;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 { first, second, const_ };
26+
27+
// CHECK: class EnumCaseIsSwiftKeyword final {
28+
// CHECK: enum class cases { first, protocol };
29+
30+
// CHECK: class EnumMultipleElementsInSingleCase final {
31+
// CHECK: enum class cases { first, second };
32+
33+
// CHECK: class EnumSingleElementInSingleCase final {
34+
// CHECK: enum class cases { first, second };

0 commit comments

Comments
 (0)