Files
swift-mirror/test/IDE/print_synthesized_extensions_generics.swift
Robert Widmann d5c226d55f Propagate Qualified Type Printing in Ambiguous Situations In More Cases
Ultimately this is to support the disambiguation of protocol requirements when printing stubs. This allows us to disambiguate the case where two modules declare a nominal type, and when that type appears in a protocol requirement. In such a case, we now fully qualify the types involved.

Fixing this also appears to now be consistently printing module qualification in many more places, hence the updates to the IDE/SourceKit tests.

rdar://72830118
2022-01-25 14:03:11 -08:00

88 lines
2.2 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module-path %t/print_synthesized_extensions_generics.swiftmodule -emit-module-doc -emit-module-doc-path %t/print_synthesized_extensions_generics.swiftdoc %s
// RUN: %target-swift-ide-test -print-module -synthesize-extension -print-interface -no-empty-line-between-members -module-to-print=print_synthesized_extensions_generics -I %t -source-filename=%s | %FileCheck %s
public protocol P1 {
associatedtype T
associatedtype U
}
public class A {}
public class B<T> : A {}
extension P1 where T : B<U> {
public func qux() {}
}
extension P1 where T : B<Int> {
public func flob() {}
}
public class C<T : A, U> {}
extension C : P1 {}
// CHECK: extension C where T : print_synthesized_extensions_generics.B<U> {
// CHECK-NEXT: func qux()
// CHECK-NEXT: }
// CHECK: extension C where T : print_synthesized_extensions_generics.B<Int> {
// CHECK-NEXT: func flob()
// CHECK-NEXT: }
public class D<U> {}
extension D : P1 {
public typealias T = B<U>
}
// CHECK: class D<U> {
// CHECK-NEXT: func qux()
// CHECK-NEXT: }
// FIXME: Arguably we should support this
// CHECK-NOT: extension D where U == Int
public class E {}
extension E: P1 {
public typealias T = B<U>
public typealias U = Int
}
// CHECK: class E {
// CHECK-NEXT: func qux()
// CHECK-NEXT: func flob()
// CHECK-NEXT: }
public class F {}
extension F : P1 {
public typealias T = B<U>
public typealias U = String
}
// CHECK: class F {
// CHECK-NEXT: func qux()
// CHECK-NEXT: }
// CHECK-NOT: extension F where T : B<Int>
public protocol P2 {
associatedtype T : P1
}
extension P2 where T.T : A {
public func blah() {}
}
public class G<T : P1> {}
extension G : P2 {}
// CHECK: extension G where T.T : print_synthesized_extensions_generics.A {
// CHECK-NEXT: func blah()
// CHECK-NEXT: }
// CHECK: extension P1 where Self.T : print_synthesized_extensions_generics.B<Self.U> {
// CHECK-NEXT: func qux()
// CHECK-NEXT: }
// CHECK: extension P1 where Self.T : print_synthesized_extensions_generics.B<Int> {
// CHECK-NEXT: func flob()
// CHECK-NEXT: }
// CHECK: extension P2 where Self.T.T : print_synthesized_extensions_generics.A {
// CHECK-NEXT: func blah()
// CHECK-NEXT: }