Skip to content

Commit dccf1ac

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

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
@@ -3398,20 +3398,18 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
33983398
bool isSimple = T->hasSimpleTypeRepr();
33993399
if (isSimple && T->is<OpaqueTypeArchetypeType>()) {
34003400
auto opaqueTy = T->castTo<OpaqueTypeArchetypeType>();
3401-
auto opaqueDecl = opaqueTy->getDecl();
3402-
if (!opaqueDecl->hasName()) {
3403-
switch (Options.OpaqueReturnTypePrinting) {
3404-
case PrintOptions::OpaqueReturnTypePrintingMode::StableReference:
3405-
case PrintOptions::OpaqueReturnTypePrintingMode::Description:
3406-
isSimple = true;
3407-
break;
3408-
case PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword:
3409-
isSimple = false;
3410-
break;
3411-
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
3412-
isSimple = opaqueTy->getConformsTo().size() < 2;
3413-
}
3414-
}
3401+
switch (Options.OpaqueReturnTypePrinting) {
3402+
case PrintOptions::OpaqueReturnTypePrintingMode::StableReference:
3403+
case PrintOptions::OpaqueReturnTypePrintingMode::Description:
3404+
isSimple = true;
3405+
break;
3406+
case PrintOptions::OpaqueReturnTypePrintingMode::WithOpaqueKeyword:
3407+
isSimple = false;
3408+
break;
3409+
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
3410+
isSimple = opaqueTy->getExistentialType()->hasSimpleTypeRepr();
3411+
break;
3412+
}
34153413
}
34163414
}
34173415

@@ -4193,14 +4191,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
41934191
Printer << "some ";
41944192
LLVM_FALLTHROUGH;
41954193
case PrintOptions::OpaqueReturnTypePrintingMode::WithoutOpaqueKeyword: {
4196-
SmallVector<Type, 2> types;
4197-
for (auto proto : T->getConformsTo())
4198-
types.push_back(proto->TypeDecl::getDeclaredInterfaceType());
4199-
4200-
// Create and visit temporary ProtocolCompositionType.
4201-
auto composition =
4202-
ProtocolCompositionType::get(T->getASTContext(), types, false);
4203-
visit(composition);
4194+
visit(T->getExistentialType());
42044195
return;
42054196
}
42064197
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)