Skip to content

Commit 3b3eade

Browse files
Merge pull request #30488 from AnthonyLatsis/ast-printer-se-0267
[ASTPrinter] Account for contextual where clauses when printing gen. requirements
2 parents 797694b + 403004b commit 3b3eade

File tree

2 files changed

+41
-22
lines changed

2 files changed

+41
-22
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ class PrintAST : public ASTVisitor<PrintAST> {
826826
void printMembers(ArrayRef<Decl *> members, bool needComma = false,
827827
bool openBracket = true, bool closeBracket = true);
828828
void printGenericDeclGenericParams(GenericContext *decl);
829-
void printGenericDeclGenericRequirements(GenericContext *decl);
829+
void printDeclGenericRequirements(GenericContext *decl);
830830
void printInherited(const Decl *decl);
831831
void printBodyIfNecessary(const AbstractFunctionDecl *decl);
832832

@@ -2055,19 +2055,23 @@ void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
20552055
printGenericSignature(GenericSig, PrintParams | InnermostOnly);
20562056
}
20572057

2058-
void PrintAST::printGenericDeclGenericRequirements(GenericContext *decl) {
2059-
if (decl->isGeneric()) {
2060-
if (auto genericSig = decl->getGenericSignature()) {
2061-
auto baseGenericSig = decl->getParent()
2062-
->getGenericSignatureOfContext();
2063-
printGenericSignature(genericSig, PrintRequirements,
2064-
[baseGenericSig](const Requirement &req) {
2065-
if (baseGenericSig)
2066-
return !baseGenericSig->isRequirementSatisfied(req);
2067-
return true;
2068-
});
2069-
}
2070-
}
2058+
void PrintAST::printDeclGenericRequirements(GenericContext *decl) {
2059+
const auto genericSig = decl->getGenericSignature();
2060+
if (!genericSig)
2061+
return;
2062+
2063+
// If the declaration is itself non-generic, it might still
2064+
// carry a contextual where clause.
2065+
const auto parentSig = decl->getParent()->getGenericSignatureOfContext();
2066+
if (parentSig && parentSig->isEqual(genericSig))
2067+
return;
2068+
2069+
printGenericSignature(genericSig, PrintRequirements,
2070+
[parentSig](const Requirement &req) {
2071+
if (parentSig)
2072+
return !parentSig->isRequirementSatisfied(req);
2073+
return true;
2074+
});
20712075
}
20722076

20732077
void PrintAST::printInherited(const Decl *decl) {
@@ -2178,7 +2182,7 @@ void PrintAST::printSynthesizedExtension(Type ExtendedType,
21782182

21792183
printExtendedTypeName(ExtendedType, Printer, Options);
21802184
printInherited(ExtDecl);
2181-
printGenericDeclGenericRequirements(ExtDecl);
2185+
printDeclGenericRequirements(ExtDecl);
21822186
}
21832187
if (Options.TypeDefinitions) {
21842188
printMembersOfDecl(ExtDecl, false,
@@ -2379,7 +2383,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
23792383
llvm::SaveAndRestore<GenericEnvironment*> setGenericEnv(Options.GenericEnv,
23802384
decl->getGenericEnvironment());
23812385
printTypeLoc(TypeLoc(decl->getUnderlyingTypeRepr(), Ty));
2382-
printGenericDeclGenericRequirements(decl);
2386+
printDeclGenericRequirements(decl);
23832387
}
23842388
}
23852389

@@ -2434,7 +2438,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
24342438
printGenericDeclGenericParams(decl);
24352439
});
24362440
printInherited(decl);
2437-
printGenericDeclGenericRequirements(decl);
2441+
printDeclGenericRequirements(decl);
24382442
}
24392443
if (Options.TypeDefinitions) {
24402444
printMembersOfDecl(decl, false, true,
@@ -2462,7 +2466,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
24622466
printGenericDeclGenericParams(decl);
24632467
});
24642468
printInherited(decl);
2465-
printGenericDeclGenericRequirements(decl);
2469+
printDeclGenericRequirements(decl);
24662470
}
24672471
if (Options.TypeDefinitions) {
24682472
printMembersOfDecl(decl, false, true,
@@ -2491,7 +2495,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
24912495
});
24922496

24932497
printInherited(decl);
2494-
printGenericDeclGenericRequirements(decl);
2498+
printDeclGenericRequirements(decl);
24952499
}
24962500

24972501
if (Options.TypeDefinitions) {
@@ -2930,7 +2934,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
29302934
ResultTyLoc, decl->isImplicitlyUnwrappedOptional());
29312935
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
29322936
}
2933-
printGenericDeclGenericRequirements(decl);
2937+
printDeclGenericRequirements(decl);
29342938
}
29352939

29362940
printBodyIfNecessary(decl);
@@ -3079,7 +3083,7 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
30793083
printTypeLocForImplicitlyUnwrappedOptional(
30803084
elementTy, decl->isImplicitlyUnwrappedOptional());
30813085
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
3082-
printGenericDeclGenericRequirements(decl);
3086+
printDeclGenericRequirements(decl);
30833087
printAccessors(decl);
30843088
}
30853089

@@ -3127,7 +3131,7 @@ void PrintAST::visitConstructorDecl(ConstructorDecl *decl) {
31273131
printFunctionParameters(decl);
31283132
});
31293133

3130-
printGenericDeclGenericRequirements(decl);
3134+
printDeclGenericRequirements(decl);
31313135

31323136
printBodyIfNecessary(decl);
31333137
}

test/IDE/print_ast_tc_decls.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,6 +1217,21 @@ struct GenericParams1<
12171217
// FIXME: in protocol compositions protocols are listed in reverse order.
12181218
//
12191219
// PASS_ONE_LINE_TYPEREPR-DAG: {{^}} func genericParams1<GenericFoo, GenericFooX, GenericBar, GenericBaz>(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}}
1220+
1221+
func contextualWhereClause1() where StructGenericBaz == Never {}
1222+
// PASS_PRINT_AST: func contextualWhereClause1() where StructGenericBaz == Never{{$}}
1223+
1224+
subscript(index: Int) -> Never where StructGenericBaz: FooProtocol {
1225+
return fatalError()
1226+
}
1227+
// PASS_PRINT_AST: subscript(index: Int) -> Never where StructGenericBaz : FooProtocol { get }{{$}}
1228+
}
1229+
extension GenericParams1 where StructGenericBaz: FooProtocol {
1230+
static func contextualWhereClause2() where StructGenericBaz: FooClass {}
1231+
// PASS_PRINT_AST: static func contextualWhereClause2() where StructGenericBaz : FooClass{{$}}
1232+
1233+
typealias ContextualWhereClause3 = Never where StructGenericBaz: QuxProtocol, StructGenericBaz.Qux == Void
1234+
// PASS_PRINT_AST: typealias ContextualWhereClause3 = Never where StructGenericBaz : QuxProtocol, StructGenericBaz.Qux == Void{{$}}
12201235
}
12211236

12221237
struct GenericParams2<T : FooProtocol> where T : BarProtocol {}

0 commit comments

Comments
 (0)