Skip to content

Commit 957d644

Browse files
authored
Merge pull request #59244 from hborla/5.7-archetype-printing
[5.7][ASTPrinter] Simplify archetype printing by visiting the interface type.
2 parents c4c214d + f01e478 commit 957d644

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
@@ -6233,8 +6233,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
62336233

62346234
void visitOpenedArchetypeType(OpenedArchetypeType *T) {
62356235
if (auto parent = T->getParent()) {
6236-
visitParentType(parent);
6237-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6236+
printArchetypeCommon(T);
62386237
return;
62396238
}
62406239

@@ -6243,8 +6242,20 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
62436242
visit(T->getExistentialType());
62446243
}
62456244

6246-
void printArchetypeCommon(ArchetypeType *T,
6247-
const AbstractTypeParamDecl *Decl) {
6245+
void printDependentMember(DependentMemberType *T) {
6246+
if (auto *const Assoc = T->getAssocType()) {
6247+
if (Options.ProtocolQualifiedDependentMemberTypes) {
6248+
Printer << "[";
6249+
Printer.printName(Assoc->getProtocol()->getName());
6250+
Printer << "]";
6251+
}
6252+
Printer.printTypeRef(T, Assoc, T->getName());
6253+
} else {
6254+
Printer.printName(T->getName());
6255+
}
6256+
}
6257+
6258+
void printArchetypeCommon(ArchetypeType *T) {
62486259
if (Options.AlternativeTypeNames) {
62496260
auto found = Options.AlternativeTypeNames->find(T->getCanonicalType());
62506261
if (found != Options.AlternativeTypeNames->end()) {
@@ -6253,36 +6264,22 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
62536264
}
62546265
}
62556266

6256-
const auto Name = T->getName();
6257-
if (Name.empty()) {
6258-
Printer << "<anonymous>";
6259-
} else if (Decl) {
6260-
Printer.printTypeRef(T, Decl, Name);
6267+
auto interfaceType = T->getInterfaceType();
6268+
if (auto *dependentMember = interfaceType->getAs<DependentMemberType>()) {
6269+
visitParentType(T->getParent());
6270+
printDependentMember(dependentMember);
62616271
} else {
6262-
Printer.printName(Name);
6272+
visit(interfaceType);
62636273
}
62646274
}
62656275

6266-
static AbstractTypeParamDecl *getAbstractTypeParamDecl(ArchetypeType *T) {
6267-
if (auto gp = T->getInterfaceType()->getAs<GenericTypeParamType>()) {
6268-
return gp->getDecl();
6269-
}
6270-
6271-
auto depMemTy = T->getInterfaceType()->castTo<DependentMemberType>();
6272-
return depMemTy->getAssocType();
6273-
}
6274-
62756276
void visitPrimaryArchetypeType(PrimaryArchetypeType *T) {
6276-
if (auto parent = T->getParent())
6277-
visitParentType(parent);
6278-
6279-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6277+
printArchetypeCommon(T);
62806278
}
62816279

62826280
void visitOpaqueTypeArchetypeType(OpaqueTypeArchetypeType *T) {
62836281
if (auto parent = T->getParent()) {
6284-
visitParentType(parent);
6285-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6282+
printArchetypeCommon(T);
62866283
return;
62876284
}
62886285

@@ -6359,9 +6356,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
63596356
}
63606357

63616358
void visitSequenceArchetypeType(SequenceArchetypeType *T) {
6362-
if (auto parent = T->getParent())
6363-
visitParentType(parent);
6364-
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
6359+
printArchetypeCommon(T);
63656360
}
63666361

63676362
void visitGenericTypeParamType(GenericTypeParamType *T) {
@@ -6419,16 +6414,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
64196414

64206415
void visitDependentMemberType(DependentMemberType *T) {
64216416
visitParentType(T->getBase());
6422-
if (auto *const Assoc = T->getAssocType()) {
6423-
if (Options.ProtocolQualifiedDependentMemberTypes) {
6424-
Printer << "[";
6425-
Printer.printName(Assoc->getProtocol()->getName());
6426-
Printer << "]";
6427-
}
6428-
Printer.printTypeRef(T, Assoc, T->getName());
6429-
} else {
6430-
Printer.printName(T->getName());
6431-
}
6417+
printDependentMember(T);
64326418
}
64336419

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

lib/AST/Type.cpp

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

6243+
case TypeKind::PrimaryArchetype: {
6244+
auto archetype = cast<const PrimaryArchetypeType>(this);
6245+
auto interface = archetype->getInterfaceType();
6246+
return interface->hasSimpleTypeRepr();
6247+
}
6248+
62436249
case TypeKind::ProtocolComposition: {
62446250
// 'Any', 'AnyObject' and single protocol compositions are simple
62456251
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)