//===--- Function.swift - Defines the Function class ----------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import SILBridging final public class Function : CustomStringConvertible, HasName { public var name: String { return SILFunction_getName(bridged).string } final public var description: String { return SILFunction_debugDescription(bridged).takeString() } public var entryBlock: BasicBlock { SILFunction_firstBlock(bridged).block! } public var blocks : List { return List(first: SILFunction_firstBlock(bridged).block) } public var arguments: LazyMapSequence { entryBlock.arguments.lazy.map { $0 as! FunctionArgument } } public var numIndirectResultArguments: Int { SILFunction_numIndirectResultArguments(bridged) } public var hasSelfArgument: Bool { SILFunction_getSelfArgumentIndex(bridged) >= 0 } public var selfArgumentIndex: Int { let selfIdx = SILFunction_getSelfArgumentIndex(bridged) assert(selfIdx >= 0) return selfIdx } public var argumentTypes: ArgumentTypeArray { ArgumentTypeArray(function: self) } public var resultType: Type { SILFunction_getSILResultType(bridged).type } public var bridged: BridgedFunction { BridgedFunction(obj: SwiftObject(self)) } } public func == (lhs: Function, rhs: Function) -> Bool { lhs === rhs } public func != (lhs: Function, rhs: Function) -> Bool { lhs !== rhs } public struct ArgumentTypeArray : RandomAccessCollection, FormattedLikeArray { fileprivate let function: Function public var startIndex: Int { return 0 } public var endIndex: Int { SILFunction_getNumSILArguments(function.bridged) } public subscript(_ index: Int) -> Type { SILFunction_getSILArgumentType(function.bridged, index).type } } // Bridging utilities extension BridgedFunction { public var function: Function { obj.getAs(Function.self) } } extension OptionalBridgedFunction { public var function: Function? { obj.getAs(Function.self) } }