From 403004b4c7ff170d3f428c602a98a8439e98461d Mon Sep 17 00:00:00 2001 From: Anthony Latsis Date: Tue, 24 Mar 2020 22:25:23 +0300 Subject: [PATCH] [ASTPrinter] Account for contextual where clauses when printing requirements --- lib/AST/ASTPrinter.cpp | 48 +++++++++++++++++-------------- test/IDE/print_ast_tc_decls.swift | 15 ++++++++++ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/lib/AST/ASTPrinter.cpp b/lib/AST/ASTPrinter.cpp index 6860ffbda7b47..0abdddb47b084 100644 --- a/lib/AST/ASTPrinter.cpp +++ b/lib/AST/ASTPrinter.cpp @@ -826,7 +826,7 @@ class PrintAST : public ASTVisitor { void printMembers(ArrayRef members, bool needComma = false, bool openBracket = true, bool closeBracket = true); void printGenericDeclGenericParams(GenericContext *decl); - void printGenericDeclGenericRequirements(GenericContext *decl); + void printDeclGenericRequirements(GenericContext *decl); void printInherited(const Decl *decl); void printBodyIfNecessary(const AbstractFunctionDecl *decl); @@ -2055,19 +2055,23 @@ void PrintAST::printGenericDeclGenericParams(GenericContext *decl) { printGenericSignature(GenericSig, PrintParams | InnermostOnly); } -void PrintAST::printGenericDeclGenericRequirements(GenericContext *decl) { - if (decl->isGeneric()) { - if (auto genericSig = decl->getGenericSignature()) { - auto baseGenericSig = decl->getParent() - ->getGenericSignatureOfContext(); - printGenericSignature(genericSig, PrintRequirements, - [baseGenericSig](const Requirement &req) { - if (baseGenericSig) - return !baseGenericSig->isRequirementSatisfied(req); - return true; - }); - } - } +void PrintAST::printDeclGenericRequirements(GenericContext *decl) { + const auto genericSig = decl->getGenericSignature(); + if (!genericSig) + return; + + // If the declaration is itself non-generic, it might still + // carry a contextual where clause. + const auto parentSig = decl->getParent()->getGenericSignatureOfContext(); + if (parentSig && parentSig->isEqual(genericSig)) + return; + + printGenericSignature(genericSig, PrintRequirements, + [parentSig](const Requirement &req) { + if (parentSig) + return !parentSig->isRequirementSatisfied(req); + return true; + }); } void PrintAST::printInherited(const Decl *decl) { @@ -2178,7 +2182,7 @@ void PrintAST::printSynthesizedExtension(Type ExtendedType, printExtendedTypeName(ExtendedType, Printer, Options); printInherited(ExtDecl); - printGenericDeclGenericRequirements(ExtDecl); + printDeclGenericRequirements(ExtDecl); } if (Options.TypeDefinitions) { printMembersOfDecl(ExtDecl, false, @@ -2379,7 +2383,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) { llvm::SaveAndRestore setGenericEnv(Options.GenericEnv, decl->getGenericEnvironment()); printTypeLoc(TypeLoc(decl->getUnderlyingTypeRepr(), Ty)); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); } } @@ -2434,7 +2438,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) { printGenericDeclGenericParams(decl); }); printInherited(decl); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); } if (Options.TypeDefinitions) { printMembersOfDecl(decl, false, true, @@ -2462,7 +2466,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) { printGenericDeclGenericParams(decl); }); printInherited(decl); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); } if (Options.TypeDefinitions) { printMembersOfDecl(decl, false, true, @@ -2491,7 +2495,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) { }); printInherited(decl); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); } if (Options.TypeDefinitions) { @@ -2930,7 +2934,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) { ResultTyLoc, decl->isImplicitlyUnwrappedOptional()); Printer.printStructurePost(PrintStructureKind::FunctionReturnType); } - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); } printBodyIfNecessary(decl); @@ -3079,7 +3083,7 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) { printTypeLocForImplicitlyUnwrappedOptional( elementTy, decl->isImplicitlyUnwrappedOptional()); Printer.printStructurePost(PrintStructureKind::FunctionReturnType); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); printAccessors(decl); } @@ -3127,7 +3131,7 @@ void PrintAST::visitConstructorDecl(ConstructorDecl *decl) { printFunctionParameters(decl); }); - printGenericDeclGenericRequirements(decl); + printDeclGenericRequirements(decl); printBodyIfNecessary(decl); } diff --git a/test/IDE/print_ast_tc_decls.swift b/test/IDE/print_ast_tc_decls.swift index 6e58881b90b4f..59bc8d69f22cc 100644 --- a/test/IDE/print_ast_tc_decls.swift +++ b/test/IDE/print_ast_tc_decls.swift @@ -1217,6 +1217,21 @@ struct GenericParams1< // FIXME: in protocol compositions protocols are listed in reverse order. // // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} func genericParams1(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}} + + func contextualWhereClause1() where StructGenericBaz == Never {} + // PASS_PRINT_AST: func contextualWhereClause1() where StructGenericBaz == Never{{$}} + + subscript(index: Int) -> Never where StructGenericBaz: FooProtocol { + return fatalError() + } + // PASS_PRINT_AST: subscript(index: Int) -> Never where StructGenericBaz : FooProtocol { get }{{$}} +} +extension GenericParams1 where StructGenericBaz: FooProtocol { + static func contextualWhereClause2() where StructGenericBaz: FooClass {} + // PASS_PRINT_AST: static func contextualWhereClause2() where StructGenericBaz : FooClass{{$}} + + typealias ContextualWhereClause3 = Never where StructGenericBaz: QuxProtocol, StructGenericBaz.Qux == Void + // PASS_PRINT_AST: typealias ContextualWhereClause3 = Never where StructGenericBaz : QuxProtocol, StructGenericBaz.Qux == Void{{$}} } struct GenericParams2 where T : BarProtocol {}