Skip to content

Commit e51770b

Browse files
authored
Merge pull request #27105 from slavapestov/ast-printer-where-clause-outer-params-5.1-08-28
ASTPrinter: Fix generic signatures with requirements on outer parameters [5.1 08/28]
2 parents d672733 + b83d0fb commit e51770b

File tree

2 files changed

+73
-11
lines changed

2 files changed

+73
-11
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,22 +1332,21 @@ void PrintAST::printGenericSignature(const GenericSignature *genericSig,
13321332
// print everything
13331333
[&](const Requirement &) { return true; });
13341334
}
1335+
13351336
void PrintAST::printGenericSignature(
13361337
const GenericSignature *genericSig, unsigned flags,
13371338
llvm::function_ref<bool(const Requirement &)> filter) {
1339+
auto requirements = genericSig->getRequirements();
1340+
13381341
if (flags & InnermostOnly) {
13391342
auto genericParams = genericSig->getInnermostGenericParams();
1340-
unsigned depth = genericParams[0]->getDepth();
1341-
SmallVector<Requirement, 2> requirementsAtDepth;
1342-
getRequirementsAtDepth(genericSig, depth, requirementsAtDepth);
13431343

1344-
printSingleDepthOfGenericSignature(genericParams, requirementsAtDepth,
1345-
flags, filter);
1344+
printSingleDepthOfGenericSignature(genericParams, requirements, flags,
1345+
filter);
13461346
return;
13471347
}
13481348

13491349
auto genericParams = genericSig->getGenericParams();
1350-
auto requirements = genericSig->getRequirements();
13511350

13521351
if (!Options.PrintInSILBody) {
13531352
printSingleDepthOfGenericSignature(genericParams, requirements, flags,
@@ -1963,15 +1962,24 @@ void PrintAST::printMembers(ArrayRef<Decl *> members, bool needComma,
19631962
}
19641963

19651964
void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
1966-
if (decl->getGenericParams())
1965+
if (decl->isGeneric())
19671966
if (auto GenericSig = decl->getGenericSignature())
19681967
printGenericSignature(GenericSig, PrintParams | InnermostOnly);
19691968
}
19701969

19711970
void PrintAST::printGenericDeclGenericRequirements(GenericContext *decl) {
1972-
if (decl->getGenericParams())
1973-
if (auto GenericSig = decl->getGenericSignature())
1974-
printGenericSignature(GenericSig, PrintRequirements | InnermostOnly);
1971+
if (decl->isGeneric()) {
1972+
if (auto genericSig = decl->getGenericSignature()) {
1973+
auto *baseGenericSig = decl->getParent()
1974+
->getGenericSignatureOfContext();
1975+
printGenericSignature(genericSig, PrintRequirements,
1976+
[baseGenericSig](const Requirement &req) {
1977+
if (baseGenericSig)
1978+
return !baseGenericSig->isRequirementSatisfied(req);
1979+
return true;
1980+
});
1981+
}
1982+
}
19751983
}
19761984

19771985
void PrintAST::printInherited(const Decl *decl) {
@@ -2112,7 +2120,7 @@ void PrintAST::printExtension(ExtensionDecl *decl) {
21122120
auto *baseGenericSig = decl->getExtendedNominal()->getGenericSignature();
21132121
assert(baseGenericSig &&
21142122
"an extension can't be generic if the base type isn't");
2115-
printGenericSignature(genericSig, PrintRequirements | InnermostOnly,
2123+
printGenericSignature(genericSig, PrintRequirements,
21162124
[baseGenericSig](const Requirement &req) -> bool {
21172125
// Only include constraints that are not satisfied by the base type.
21182126
return !baseGenericSig->isRequirementSatisfied(req);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-swift-frontend -typecheck %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
4+
// RUN: %FileCheck %s < %t/main.swiftinterface
5+
6+
// RUN: %target-build-swift %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
7+
// RUN: %FileCheck %s < %t/main.swiftinterface
8+
9+
// RUN: %target-build-swift %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution -wmo
10+
// RUN: %FileCheck %s < %t/main.swiftinterface
11+
12+
// CHECK: import Swift
13+
14+
// CHECK: public struct Holder<Value> {
15+
public struct Holder<Value> {
16+
var value: Value
17+
18+
// CHECK-NEXT: public init(value: Value){{$}}
19+
public init(value: Value) {
20+
self.value = value
21+
}
22+
23+
// CHECK-NEXT: public init<T>(_ value: T) where Value == Swift.AnyHashable, T : Swift.Hashable{{$}}
24+
public init<T : Hashable>(_ value: T) where Value == AnyHashable {
25+
self.value = value
26+
}
27+
28+
// CHECK-NEXT: public struct Transform<Result> {
29+
public struct Transform<Result> {
30+
var fn: (Value) -> Result
31+
32+
// CHECK-NEXT: public init(fn: @escaping (Value) -> Result){{$}}
33+
public init(fn: @escaping (Value) -> Result) {
34+
self.fn = fn
35+
}
36+
37+
// CHECK-NEXT: func transform(_ holder: main.Holder<Value>) -> Result{{$}}
38+
public func transform(_ holder: Holder<Value>) -> Result {
39+
return fn(holder.value)
40+
}
41+
42+
// CHECK-NEXT: }
43+
}
44+
45+
// CHECK-NEXT: }
46+
}
47+
48+
// CHECK-NEXT: extension Holder.Transform where Value == Swift.Int {
49+
extension Holder.Transform where Value == Int {
50+
// CHECK-NEXT: public func negate(_ holder: main.Holder<Value>) -> Result{{$}}
51+
public func negate(_ holder: Holder<Value>) -> Result {
52+
return transform(Holder(value: -holder.value))
53+
}
54+
}

0 commit comments

Comments
 (0)