Files
swift-mirror/test/Runtime/demangleToMetadataObjC.swift
Joe Groff e2dd2ff11f Runtime: Handle synthesized decl "related entity" tags.
Clang-importer-synthesized declarations get an extra tag character included in their mangling, which was not being preserved in type context descriptors. This caused runtime lookup for these synthesized types to fail. Fix this by adding the tag information to type context descriptors and teaching the runtime to match it up when fetching metadata by mangled name. Fixes rdar://problem/40878715.
2018-06-28 12:11:12 -07:00

90 lines
2.6 KiB
Swift

// RUN: %target-run-simple-swift-swift3
// REQUIRES: executable_test
// REQUIRES: objc_interop
import StdlibUnittest
import Foundation
import CoreFoundation
import CoreLocation
let DemangleToMetadataTests = TestSuite("DemangleToMetadataObjC")
@objc class C : NSObject { }
@objc enum E: Int { case a }
@objc protocol P1 { }
protocol P2 { }
DemangleToMetadataTests.test("@objc classes") {
expectEqual(type(of: C()), _typeByMangledName("4main1CC")!)
}
DemangleToMetadataTests.test("@objc enums") {
expectEqual(type(of: E.a), _typeByMangledName("4main1EO")!)
}
func f1_composition_objc_protocol(_: P1) { }
DemangleToMetadataTests.test("@objc protocols") {
expectEqual(type(of: f1_composition_objc_protocol),
_typeByMangledName("yy4main2P1_pc")!)
}
DemangleToMetadataTests.test("Objective-C classes") {
expectEqual(type(of: NSObject()), _typeByMangledName("So8NSObjectC")!)
}
func f1_composition_NSCoding(_: NSCoding) { }
DemangleToMetadataTests.test("Objective-C protocols") {
expectEqual(type(of: f1_composition_NSCoding), _typeByMangledName("yySo8NSCoding_pc")!)
}
DemangleToMetadataTests.test("Classes that don't exist") {
expectNil(_typeByMangledName("4main4BoomC"))
}
DemangleToMetadataTests.test("CoreFoundation classes") {
expectEqual(CFArray.self, _typeByMangledName("So10CFArrayRefa")!)
}
DemangleToMetadataTests.test("Imported error types") {
expectEqual(URLError.self, _typeByMangledName("10Foundation8URLErrorV")!)
expectEqual(URLError.Code.self,
_typeByMangledName("10Foundation8URLErrorV4CodeV")!)
}
DemangleToMetadataTests.test("Imported swift_wrapper types") {
expectEqual(URLFileResourceType.self,
_typeByMangledName("So21NSURLFileResourceTypea")!)
}
DemangleToMetadataTests.test("Imported enum types") {
expectEqual(NSURLSessionTask.State.self,
_typeByMangledName("So21NSURLSessionTaskStateV")!)
}
class CG4<T: P1, U: P2> { }
extension C : P1 { }
extension C : P2 { }
class D: P2 { }
DemangleToMetadataTests.test("@objc protocol conformances") {
expectEqual(CG4<C, C>.self,
_typeByMangledName("4main3CG4CyAA1CCAA1CCG")!)
expectNil(_typeByMangledName("4main3CG4CyAA1DCAA1DCG"))
}
DemangleToMetadataTests.test("synthesized declarations") {
expectEqual(CLError.self, _typeByMangledName("SC7CLErrorLeV")!)
expectNil(_typeByMangledName("SC7CLErrorV"))
expectEqual(CLError.Code.self, _typeByMangledName("So7CLErrorV")!)
let error = NSError(domain: NSCocoaErrorDomain, code: 0)
let reflectionString = String(reflecting: CLError(_nsError: error))
expectTrue(reflectionString.hasPrefix("__C_Synthesized.related decl 'e' for CLError(_nsError:"))
}
runAllTests()