Skip to content

Commit 9496c63

Browse files
authored
Merge pull request #15918 from johnfairh/typealias-where
[ASTPrinter] Print typealias generic requirements
2 parents 64a486d + 315fd8c commit 9496c63

File tree

3 files changed

+27
-38
lines changed

3 files changed

+27
-38
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -611,8 +611,8 @@ class PrintAST : public ASTVisitor<PrintAST> {
611611
bool openBracket = true, bool closeBracket = true);
612612
void printMembers(ArrayRef<Decl *> members, bool needComma = false,
613613
bool openBracket = true, bool closeBracket = true);
614-
void printNominalDeclGenericParams(NominalTypeDecl *decl);
615-
void printNominalDeclGenericRequirements(NominalTypeDecl *decl);
614+
void printGenericDeclGenericParams(GenericContext *decl);
615+
void printGenericDeclGenericRequirements(GenericContext *decl);
616616
void printInherited(const Decl *decl);
617617

618618
void printEnumElement(EnumElementDecl *elt);
@@ -1655,13 +1655,13 @@ void PrintAST::printMembers(ArrayRef<Decl *> members, bool needComma,
16551655
Printer << "}";
16561656
}
16571657

1658-
void PrintAST::printNominalDeclGenericParams(NominalTypeDecl *decl) {
1658+
void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
16591659
if (decl->getGenericParams())
16601660
if (auto GenericSig = decl->getGenericSignature())
16611661
printGenericSignature(GenericSig, PrintParams | InnermostOnly);
16621662
}
16631663

1664-
void PrintAST::printNominalDeclGenericRequirements(NominalTypeDecl *decl) {
1664+
void PrintAST::printGenericDeclGenericRequirements(GenericContext *decl) {
16651665
if (decl->getGenericParams())
16661666
if (auto GenericSig = decl->getGenericSignature())
16671667
printGenericSignature(GenericSig, PrintRequirements | InnermostOnly);
@@ -1776,10 +1776,7 @@ void PrintAST::printSynthesizedExtension(Type ExtendedType,
17761776

17771777
printExtendedTypeName(ExtendedType, Printer, Options);
17781778
printInherited(ExtDecl);
1779-
1780-
if (ExtDecl->getGenericParams())
1781-
if (auto *GenericSig = ExtDecl->getGenericSignature())
1782-
printGenericSignature(GenericSig, PrintRequirements | InnermostOnly);
1779+
printGenericDeclGenericRequirements(ExtDecl);
17831780
}
17841781
if (Options.TypeDefinitions) {
17851782
printMembersOfDecl(ExtDecl, false,
@@ -1933,9 +1930,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
19331930
[&]{
19341931
Printer.printName(decl->getName());
19351932
}, [&]{ // Signature
1936-
if (decl->getGenericParams())
1937-
if (auto *genericSig = decl->getGenericSignature())
1938-
printGenericSignature(genericSig, PrintParams | InnermostOnly);
1933+
printGenericDeclGenericParams(decl);
19391934
});
19401935
bool ShouldPrint = true;
19411936
Type Ty = decl->getUnderlyingTypeLoc().getType();
@@ -1947,6 +1942,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
19471942
if (ShouldPrint) {
19481943
Printer << " = ";
19491944
printTypeLoc(decl->getUnderlyingTypeLoc());
1945+
printGenericDeclGenericRequirements(decl);
19501946
}
19511947
}
19521948

@@ -2008,10 +2004,10 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
20082004
[&]{
20092005
Printer.printName(decl->getName());
20102006
}, [&]{ // Signature
2011-
printNominalDeclGenericParams(decl);
2007+
printGenericDeclGenericParams(decl);
20122008
});
20132009
printInherited(decl);
2014-
printNominalDeclGenericRequirements(decl);
2010+
printGenericDeclGenericRequirements(decl);
20152011
}
20162012
if (Options.TypeDefinitions) {
20172013
printMembersOfDecl(decl, false, true,
@@ -2036,10 +2032,10 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
20362032
[&]{
20372033
Printer.printName(decl->getName());
20382034
}, [&]{ // Signature
2039-
printNominalDeclGenericParams(decl);
2035+
printGenericDeclGenericParams(decl);
20402036
});
20412037
printInherited(decl);
2042-
printNominalDeclGenericRequirements(decl);
2038+
printGenericDeclGenericRequirements(decl);
20432039
}
20442040
if (Options.TypeDefinitions) {
20452041
printMembersOfDecl(decl, false, true,
@@ -2064,11 +2060,11 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
20642060
[&]{
20652061
Printer.printName(decl->getName());
20662062
}, [&]{ // Signature
2067-
printNominalDeclGenericParams(decl);
2063+
printGenericDeclGenericParams(decl);
20682064
});
20692065

20702066
printInherited(decl);
2071-
printNominalDeclGenericRequirements(decl);
2067+
printGenericDeclGenericRequirements(decl);
20722068
}
20732069

20742070
if (Options.TypeDefinitions) {
@@ -2511,10 +2507,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
25112507
Printer << " ";
25122508
}
25132509
}, [&] { // Parameters
2514-
if (decl->isGeneric())
2515-
if (auto *genericSig = decl->getGenericSignature())
2516-
printGenericSignature(genericSig, PrintParams | InnermostOnly);
2517-
2510+
printGenericDeclGenericParams(decl);
25182511
printFunctionParameters(decl);
25192512
});
25202513

@@ -2538,9 +2531,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
25382531
printTypeLoc(ResultTyLoc);
25392532
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
25402533
}
2541-
if (decl->isGeneric())
2542-
if (auto *genericSig = decl->getGenericSignature())
2543-
printGenericSignature(genericSig, PrintRequirements | InnermostOnly);
2534+
printGenericDeclGenericRequirements(decl);
25442535
}
25452536

25462537
if (auto BodyFunc = Options.FunctionBody) {
@@ -2639,10 +2630,7 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
26392630
recordDeclLoc(decl, [&]{
26402631
Printer << "subscript";
26412632
}, [&] { // Parameters
2642-
if (decl->isGeneric())
2643-
if (auto *genericSig = decl->getGenericSignature())
2644-
printGenericSignature(genericSig, PrintParams | InnermostOnly);
2645-
2633+
printGenericDeclGenericParams(decl);
26462634
printParameterList(decl->getIndices(),
26472635
decl->hasInterfaceType()
26482636
? decl->getIndicesInterfaceType()
@@ -2661,9 +2649,7 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
26612649
else
26622650
printTypeLoc(elementTy);
26632651
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
2664-
if (decl->isGeneric())
2665-
if (auto *genericSig = decl->getGenericSignature())
2666-
printGenericSignature(genericSig, PrintRequirements | InnermostOnly);
2652+
printGenericDeclGenericRequirements(decl);
26672653
printAccessors(decl);
26682654
}
26692655

@@ -2699,16 +2685,11 @@ void PrintAST::visitConstructorDecl(ConstructorDecl *decl) {
26992685
break;
27002686
}
27012687

2702-
if (decl->isGeneric())
2703-
if (auto *genericSig = decl->getGenericSignature())
2704-
printGenericSignature(genericSig, PrintParams | InnermostOnly);
2705-
2688+
printGenericDeclGenericParams(decl);
27062689
printFunctionParameters(decl);
27072690
});
27082691

2709-
if (decl->isGeneric())
2710-
if (auto *genericSig = decl->getGenericSignature())
2711-
printGenericSignature(genericSig, PrintRequirements | InnermostOnly);
2692+
printGenericDeclGenericRequirements(decl);
27122693

27132694
if (auto BodyFunc = Options.FunctionBody) {
27142695
Printer << " {";

test/IDE/print_ast_tc_decls.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,3 +1379,5 @@ public typealias MyPairI<B> = MyPair<Int, B>
13791379
// PASS_PRINT_AST: public typealias MyPairI<B> = MyPair<Int, B>
13801380
public typealias MyPairAlias<T, U> = MyPair<T, U>
13811381
// PASS_PRINT_AST: public typealias MyPairAlias<T, U> = MyPair<T, U>
1382+
public typealias MyPairAlias2<T: FooProtocol, U> = MyPair<T, U> where U: BarProtocol
1383+
// PASS_PRINT_AST: public typealias MyPairAlias2<T, U> = MyPair<T, U> where T : FooProtocol, U : BarProtocol

test/SourceKit/CursorInfo/cursor_info.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ func funcWithNestedEscaping(a : (@escaping () -> ()) -> ()) {}
220220
/// doc
221221
typealias typeWithNestedAutoclosure = (@autoclosure () -> ()) -> ()
222222

223+
typealias GenericAlias<T, U> = MyAlias<T, U> where T: P1
224+
223225
// REQUIRES: objc_interop
224226
// RUN: %empty-directory(%t.tmp)
225227
// RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift
@@ -746,3 +748,7 @@ typealias typeWithNestedAutoclosure = (@autoclosure () -> ()) -> ()
746748
// RUN: %sourcekitd-test -req=cursor -pos=221:11 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK90 %s
747749
// CHECK90: <Declaration>typealias typeWithNestedAutoclosure = (@autoclosure () -&gt; ()) -&gt; ()</Declaration>
748750
// CHECK90-NEXT: <decl.var.parameter.type><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@autoclosure</syntaxtype.attribute.name></syntaxtype.attribute.builtin> () -&gt; <decl.function.returntype><tuple>()</tuple></decl.function.returntype></decl.var.parameter.type>
751+
752+
// RUN: %sourcekitd-test -req=cursor -pos=223:11 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK91 %s
753+
// CHECK91: <Declaration>typealias GenericAlias&lt;T, U&gt; = <Type usr="s:11cursor_info7MyAliasa">MyAlias</Type>&lt;<Type usr="s:11cursor_info12GenericAliasa1Txmfp">T</Type>, <Type usr="s:11cursor_info12GenericAliasa1Uq_mfp">U</Type>&gt; where T : <Type usr="s:11cursor_info2P1P">P1</Type></Declaration>
754+
// CHECK91-NEXT: <decl.typealias><syntaxtype.keyword>typealias</syntaxtype.keyword> <decl.name>GenericAlias</decl.name>&lt;<decl.generic_type_param usr="s:11cursor_info12GenericAliasa1Txmfp"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="s:11cursor_info12GenericAliasa1Uq_mfp"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt; = <ref.typealias usr="s:11cursor_info7MyAliasa">MyAlias</ref.typealias>&lt;<ref.generic_type_param usr="s:11cursor_info12GenericAliasa1Txmfp">T</ref.generic_type_param>, <ref.generic_type_param usr="s:11cursor_info12GenericAliasa1Uq_mfp">U</ref.generic_type_param>&gt; <syntaxtype.keyword>where</syntaxtype.keyword> <decl.generic_type_requirement>T : <ref.protocol usr="s:11cursor_info2P1P">P1</ref.protocol></decl.generic_type_requirement></decl.typealias>

0 commit comments

Comments
 (0)