Skip to content

Commit 6126665

Browse files
committed
[ASTPrinter] Print opaque type using ArchetypeType::getExistentialType()
Previously, it did't take super class constraint into account. rdar://problem/50113513
1 parent 3197c22 commit 6126665

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3426,20 +3426,18 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
34263426
bool isSimple = T->hasSimpleTypeRepr();
34273427
if (isSimple && T->is<OpaqueTypeArchetypeType>()) {
34283428
auto opaqueTy = T->castTo<OpaqueTypeArchetypeType>();
3429-
auto opaqueDecl = opaqueTy->getDecl();
3430-
if (!opaqueDecl->hasName()) {
3431-
switch (Options.OpaqueReturnTypePrinting) {
3432-
case PrintOptions::OpaqueReturnTypePrintingMode::StableReference:
3433-
case PrintOptions::OpaqueReturnTypePrintingMode::Description:
3434-
isSimple = true;
3435-
break;
3436-
case PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword:
3437-
isSimple = false;
3438-
break;
3439-
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
3440-
isSimple = opaqueTy->getConformsTo().size() < 2;
3441-
}
3442-
}
3429+
switch (Options.OpaqueReturnTypePrinting) {
3430+
case PrintOptions::OpaqueReturnTypePrintingMode::StableReference:
3431+
case PrintOptions::OpaqueReturnTypePrintingMode::Description:
3432+
isSimple = true;
3433+
break;
3434+
case PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword:
3435+
isSimple = false;
3436+
break;
3437+
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
3438+
isSimple = opaqueTy->getExistentialType()->hasSimpleTypeRepr();
3439+
break;
3440+
}
34433441
}
34443442
}
34453443

@@ -4221,14 +4219,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
42214219
Printer << "some ";
42224220
LLVM_FALLTHROUGH;
42234221
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
4224-
SmallVector<Type, 2> types;
4225-
for (auto proto : T->getConformsTo())
4226-
types.push_back(proto->TypeDecl::getDeclaredInterfaceType());
4227-
4228-
// Create and visit temporary ProtocolCompositionType.
4229-
auto composition =
4230-
ProtocolCompositionType::get(T->getASTContext(), types, false);
4231-
visit(composition);
4222+
visit(T->getExistentialType());
42324223
return;
42334224
}
42344225
case PrintOptions::OpaqueReturnTypePrintingMode::StableReference: {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %swift-ide-test -print-swift-file-interface -source-filename %s
2+
3+
public class Base {}
4+
// CHECK: public class Base {
5+
public protocol Proto {}
6+
// CHECK: public protocol Proto {
7+
}
8+
public func foo() -> some Base & Proto {
9+
// CHECK: public func foo() -> some Base & Proto
10+
class Derived: Base, Proto {}
11+
return Derived()
12+
}

0 commit comments

Comments
 (0)