Skip to content

NFC: Test printing swiftinterfaces containing declarations originally written using typealiases from another module #60179

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 22, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions test/ModuleInterface/cross-module-typealias.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
// RUN: %empty-directory(%t)
// RUN: split-file %s %t

// RUN: %target-swift-emit-module-interface(%t/Original.swiftinterface) %t/Original.swift
// RUN: %target-swift-typecheck-module-from-interface(%t/Original.swiftinterface)

// RUN: %target-swift-emit-module-interface(%t/Aliases.swiftinterface) %t/Aliases.swift -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/Aliases.swiftinterface) -I %t

// RUN: %target-swift-emit-module-interface(%t/UsesAliases.swiftinterface) %t/UsesAliases.swift -I %t -disable-availability-checking
// TODO: enable verification of UsesAliases.swiftinterface (rdar://91447971)
// RUN/: %target-swift-typecheck-module-from-interface(%t/UsesAliases.swiftinterface) -I %t

// RUN: %FileCheck %s < %t/UsesAliases.swiftinterface


//--- Original.swift

open class Clazz {}

public protocol Proto {
func requirement()
}

public struct Struct {
public init() {}
}

@propertyWrapper
public struct Wrapper<T> {
public var wrappedValue: T
public init(wrappedValue: T) {
self.wrappedValue = wrappedValue
}
}


//--- Aliases.swift

import Original

public typealias ClazzAlias = Clazz
public typealias ProtoAlias = Proto
public typealias StructAlias = Struct
public typealias WrapperAlias = Wrapper


//--- UsesAliases.swift

import Aliases

// CHECK: public class InheritsFromClazzAlias : Aliases.ClazzAlias
public class InheritsFromClazzAlias: ClazzAlias {}

// CHECK: public protocol HasAssociatedTypeWithStructAliasDefault
public protocol HasAssociatedTypeWithStructAliasDefault {
// CHECK: associatedtype Assoc = Aliases.StructAlias
associatedtype Assoc = StructAlias
}

// CHECK: public func usesStructAlias(_ x: Aliases.StructAlias) -> Aliases.StructAlias
public func usesStructAlias(_ x: StructAlias) -> StructAlias {
return x
}

// CHECK: public func usesGenericTypesConstrainedToProtoAlias<T>(_ x: T) -> T where T : Original.Proto
public func usesGenericTypesConstrainedToProtoAlias<T: ProtoAlias>(_ x: T) -> T {
return x
}

// CHECK: public func usesGenericTypesConstrainedToProtoAliasWithWhereClause<T>(_ x: T) -> T where T : Original.Proto
public func usesGenericTypesConstrainedToProtoAliasWithWhereClause<T>(_ x: T) -> T where T: ProtoAlias {
return x
}

// TODO: opaque parameters should probably print fully qualified
// CHECK: public func usesOpaqueProtoAliasTypes(_ x: some ProtoAlias) -> some Original.Proto
public func usesOpaqueProtoAliasTypes(_ x: some ProtoAlias) -> some ProtoAlias {
return x
}

// CHECK: public func usesExistentialProtoAliasTypes(_ x: any Original.Proto) -> any Original.Proto
public func usesExistentialProtoAliasTypes(_ x: any ProtoAlias) -> any ProtoAlias {
return x
}

// CHECK: public struct ConformsToProtoAlias : Aliases.ProtoAlias
public struct ConformsToProtoAlias: ProtoAlias {
// CHECK: @_implements(Aliases.ProtoAlias, requirement) public func requirement()
@_implements(ProtoAlias, requirement) public func requirement() {}
}

// CHECK: public struct HasProtoAliasGenericConstraint<T> where T : Original.Proto
public struct HasProtoAliasGenericConstraint<T: ProtoAlias> {}

// CHECK: public struct HasMembers
public struct HasMembers {
// CHECK: public var foo: Aliases.StructAlias
public var foo: StructAlias

// CHECK: public var fooInferred: Aliases.StructAlias
public var fooInferred = StructAlias()

// CHECK: public var closure: (Aliases.StructAlias) -> Aliases.StructAlias
public var closure: (StructAlias) -> StructAlias

// CHECK: public var closureInferred: (_ x: Aliases.StructAlias) -> Aliases.StructAlias
public var closureInferred = { (x: StructAlias) -> StructAlias in
return x
}

// TODO: referencing StructAlias here results in a spurious warning:
// warning: cannot use struct 'Struct' here; 'Original' was not imported by this file
// CHECK: public var tuple: (Aliases.StructAlias)
public var tuple: (StructAlias)

// CHECK: public subscript(i: Aliases.StructAlias) -> Aliases.StructAlias
public subscript(i: StructAlias) -> StructAlias {
return i
}

// CHECK: @Original.Wrapper public var wrapped: Swift.Int
@WrapperAlias public var wrapped: Int
}

// CHECK: public enum HasCasePayloads
public enum HasCasePayloads {
// CHECK: case hasStructAlias(Aliases.StructAlias)
case hasStructAlias(StructAlias)

// CHECK: case hasExistentialProtoAlias(any Original.Proto)
case hasExistentialProtoAlias(any ProtoAlias)
}

// CHECK: extension Original.Struct
extension StructAlias {
// CHECK-NEXT: public func publicMember()
public func publicMember() {}
}

// CHECK: public typealias ProtoAliasAlias = Aliases.ProtoAlias
public typealias ProtoAliasAlias = ProtoAlias

// TODO: @_typeEraser should probably print fully qualified
// CHECK: @_typeEraser(StructAlias) public protocol StructAliasTypeEraser
@_typeEraser(StructAlias) public protocol StructAliasTypeEraser {}

// CHECK: extension Original.Struct : UsesAliases.StructAliasTypeEraser
extension StructAlias: StructAliasTypeEraser {
// CHECK: public init<T>(erasing: T) where T : UsesAliases.StructAliasTypeEraser
public init<T: StructAliasTypeEraser>(erasing: T) {}
}