Skip to content

Commit 0ba655e

Browse files
committed
[ASTPrinter] Simplify archetype printing by visiting the interface type.
1 parent e4d8fa4 commit 0ba655e

File tree

4 files changed

+40
-40
lines changed

4 files changed

+40
-40
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6289,8 +6289,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
62896289

62906290
void visitOpenedArchetypeType(OpenedArchetypeType *T) {
62916291
if (auto parent = T->getParent()) {
6292-
visitParentType(parent);
6293-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6292+
printArchetypeCommon(T);
62946293
return;
62956294
}
62966295

@@ -6299,8 +6298,20 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
62996298
visit(T->getExistentialType());
63006299
}
63016300

6302-
void printArchetypeCommon(ArchetypeType *T,
6303-
const AbstractTypeParamDecl *Decl) {
6301+
void printDependentMember(DependentMemberType *T) {
6302+
if (auto *const Assoc = T->getAssocType()) {
6303+
if (Options.ProtocolQualifiedDependentMemberTypes) {
6304+
Printer << "[";
6305+
Printer.printName(Assoc->getProtocol()->getName());
6306+
Printer << "]";
6307+
}
6308+
Printer.printTypeRef(T, Assoc, T->getName());
6309+
} else {
6310+
Printer.printName(T->getName());
6311+
}
6312+
}
6313+
6314+
void printArchetypeCommon(ArchetypeType *T) {
63046315
if (Options.AlternativeTypeNames) {
63056316
auto found = Options.AlternativeTypeNames->find(T->getCanonicalType());
63066317
if (found != Options.AlternativeTypeNames->end()) {
@@ -6309,36 +6320,22 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
63096320
}
63106321
}
63116322

6312-
const auto Name = T->getName();
6313-
if (Name.empty()) {
6314-
Printer << "<anonymous>";
6315-
} else if (Decl) {
6316-
Printer.printTypeRef(T, Decl, Name);
6323+
auto interfaceType = T->getInterfaceType();
6324+
if (auto *dependentMember = interfaceType->getAs<DependentMemberType>()) {
6325+
visitParentType(T->getParent());
6326+
printDependentMember(dependentMember);
63176327
} else {
6318-
Printer.printName(Name);
6328+
visit(interfaceType);
63196329
}
63206330
}
63216331

6322-
static AbstractTypeParamDecl *getAbstractTypeParamDecl(ArchetypeType *T) {
6323-
if (auto gp = T->getInterfaceType()->getAs<GenericTypeParamType>()) {
6324-
return gp->getDecl();
6325-
}
6326-
6327-
auto depMemTy = T->getInterfaceType()->castTo<DependentMemberType>();
6328-
return depMemTy->getAssocType();
6329-
}
6330-
63316332
void visitPrimaryArchetypeType(PrimaryArchetypeType *T) {
6332-
if (auto parent = T->getParent())
6333-
visitParentType(parent);
6334-
6335-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6333+
printArchetypeCommon(T);
63366334
}
63376335

63386336
void visitOpaqueTypeArchetypeType(OpaqueTypeArchetypeType *T) {
63396337
if (auto parent = T->getParent()) {
6340-
visitParentType(parent);
6341-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6338+
printArchetypeCommon(T);
63426339
return;
63436340
}
63446341

@@ -6415,9 +6412,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
64156412
}
64166413

64176414
void visitSequenceArchetypeType(SequenceArchetypeType *T) {
6418-
if (auto parent = T->getParent())
6419-
visitParentType(parent);
6420-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6415+
printArchetypeCommon(T);
64216416
}
64226417

64236418
void visitGenericTypeParamType(GenericTypeParamType *T) {
@@ -6475,16 +6470,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
64756470

64766471
void visitDependentMemberType(DependentMemberType *T) {
64776472
visitParentType(T->getBase());
6478-
if (auto *const Assoc = T->getAssocType()) {
6479-
if (Options.ProtocolQualifiedDependentMemberTypes) {
6480-
Printer << "[";
6481-
Printer.printName(Assoc->getProtocol()->getName());
6482-
Printer << "]";
6483-
}
6484-
Printer.printTypeRef(T, Assoc, T->getName());
6485-
} else {
6486-
Printer.printName(T->getName());
6487-
}
6473+
printDependentMember(T);
64886474
}
64896475

64906476
#define REF_STORAGE(Name, name, ...) \

lib/AST/Type.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6242,6 +6242,12 @@ bool TypeBase::hasSimpleTypeRepr() const {
62426242
case TypeKind::OpenedArchetype:
62436243
return false;
62446244

6245+
case TypeKind::PrimaryArchetype: {
6246+
auto archetype = cast<const PrimaryArchetypeType>(this);
6247+
auto interface = archetype->getInterfaceType();
6248+
return interface->hasSimpleTypeRepr();
6249+
}
6250+
62456251
case TypeKind::ProtocolComposition: {
62466252
// 'Any', 'AnyObject' and single protocol compositions are simple
62476253
auto composition = cast<const ProtocolCompositionType>(this);

test/Generics/opaque_archetype_concrete_requirement.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct DefinesOpaqueP1 : P {
3030
struct ConcreteHasP<T : P1, TT : P2, TU> {}
3131

3232
// CHECK-LABEL: ExtensionDecl line={{.*}} base=ConcreteHasP
33-
// CHECK-NEXT: Generic signature: <T, TT, TU where T == some P1, TT == (some P1).T, TU == (some P1).U>
33+
// CHECK-NEXT: Generic signature: <T, TT, TU where T == some P1, TT == (some P1).[P1]T, TU == (some P1).[P1]U>
3434
extension ConcreteHasP where T == DefinesOpaqueP1.T, TT == T.T, TU == T.U {
3535
func checkSameType1(_ t: TT) -> DefinesOpaqueP1.T.T { return t }
3636
func checkSameType2(_ u: TU) -> DefinesOpaqueP1.T.U { return u }
@@ -47,7 +47,7 @@ protocol HasP {
4747
}
4848

4949
// CHECK-LABEL: ExtensionDecl line={{.*}} base=HasP
50-
// CHECK-NEXT: Generic signature: <Self where Self : HasP, Self.[HasP]T == some P1, Self.[HasP]U == G<(some P1).T>>
50+
// CHECK-NEXT: Generic signature: <Self where Self : HasP, Self.[HasP]T == some P1, Self.[HasP]U == G<(some P1).[P1]T>>
5151
extension HasP where T == DefinesOpaqueP1.T, U == G<T.T> {
5252
func checkSameType1(_ t: T.T) -> DefinesOpaqueP1.T.T { return t }
5353
func checkSameType2(_ u: T.U) -> DefinesOpaqueP1.T.U { return u }

test/type/opaque_parameters.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ protocol Q {
66
associatedtype A: P & Equatable
77

88
func f() -> A
9+
func takesA(_: A)
910
}
1011

1112
extension Int: P { }
@@ -16,17 +17,24 @@ extension Array: Q where Element: P, Element: Equatable {
1617
func f() -> Element {
1718
return first!
1819
}
20+
21+
func takesA(_: Element) {}
1922
}
2023

2124
extension Set: Q where Element: P, Element: Equatable { // expected-warning {{redundant conformance constraint 'Element' : 'Equatable'}}
2225
func f() -> Element {
2326
return first!
2427
}
28+
29+
func takesA(_: Element) {}
2530
}
2631

2732
// expected-note@+2{{where 'some Q' = 'Int'}}
2833
// expected-note@+1{{in call to function 'takesQ'}}
2934
func takesQ(_ q: some Q) -> Bool {
35+
// expected-error@+1 {{cannot convert value of type 'Int' to expected argument type '(some Q).A'}}
36+
q.takesA(1)
37+
3038
return q.f() == q.f()
3139
}
3240

0 commit comments

Comments
 (0)