diff options
Diffstat (limited to 'swift/src')
-rw-r--r-- | swift/src/Ice/ClassResolver.swift | 63 |
1 files changed, 23 insertions, 40 deletions
diff --git a/swift/src/Ice/ClassResolver.swift b/swift/src/Ice/ClassResolver.swift index fe573d1b41a..ba00502c0c7 100644 --- a/swift/src/Ice/ClassResolver.swift +++ b/swift/src/Ice/ClassResolver.swift @@ -9,58 +9,41 @@ import Foundation +open class ValueTypeResolver: NSObject { + open func type() -> Value.Type { + precondition(false, "Abstract method") + } +} + +open class UserExceptionTypeResolver: NSObject { + open func type() -> UserException.Type { + precondition(false, "Abstract method") + } +} + // -// Slice classes and exceptions extend Ice.ClassResolver with a static func -// which returns the Swift Value.Type or UserException.Type. -// -// We subclass NSObject so that we can use selectors. +// Slice classes and exceptions generate an extesion for +// Ice.ClassResolver with a static func which returns a +// ValueTypeRessolver or UserExceptionTypeRessolver. // -// @objc dynamic Module_MyClass() -> Value.Type public class ClassResolver: NSObject { - private static func mangle(typeId: String) -> String { - precondition(typeId.count > 2, "invalid type id") - - guard let r = typeId.range(of: "::") else { - preconditionFailure("invalid type id") - } - - precondition(r.lowerBound == typeId.startIndex, "invalid type id") - - let c = typeId.components(separatedBy: "::")[1...] - return c.joined(separator: "_") - } - - static func resolve(typeId: String) -> Value.Type? { - let selector = Selector(mangle(typeId: typeId)) + static private func resolveImpl(typeId: String) -> AnyObject? { + let start = typeId.index(typeId.startIndex, offsetBy: 2) + let selector = Selector(typeId[start...].replacingOccurrences(of: "::", with: "_")) guard ClassResolver.responds(to: selector) else { return nil } + return ClassResolver.perform(selector).takeUnretainedValue() + } - #warning("TODO: check this is correct wrt memory management") - let val = ClassResolver.perform(Selector(mangle(typeId: typeId))).takeRetainedValue() - - guard let valueType = val as? Value.Type else { - preconditionFailure("unexpected value type") - } - return valueType + static func resolve(typeId: String) -> Value.Type? { + return (resolveImpl(typeId: typeId) as! ValueTypeResolver).type() } static func resolve(typeId: String) -> UserException.Type? { - let selector = Selector(mangle(typeId: typeId)) - - guard ClassResolver.responds(to: selector) else { - return nil - } - - #warning("TODO: check this is correct wrt memory management") - let val = ClassResolver.perform(selector).takeRetainedValue() - - guard let valueType = val as? UserException.Type else { - preconditionFailure("unexpected value type") - } - return valueType + return (resolveImpl(typeId: typeId) as! UserExceptionTypeResolver).type() } } |