Files
swift-mirror/SwiftCompilerSources/Sources/SIL/Function.swift
Erik Eckstein cec4b82b39 swift SIL: add some SIL type related bridging
* `Function.argumentTypes` and `Function.resultType`
* `Type.isNominal`, `Type.isClass`, `Type.isTuple`, `Type.isStruct` and `Type.isEnum`
* `Type.getFieldIndexOfNominal`
* `Type.getFieldTypeOfNominal`
* `Type.tupleElements`
* `Type.description` for better debugging

# Conflicts:
#	SwiftCompilerSources/Sources/SIL/Type.swift
#	SwiftCompilerSources/Sources/SIL/Utils.swift
#	SwiftCompilerSources/Sources/SIL/Value.swift
#	include/swift/SIL/SILBridging.h
#	lib/SIL/Utils/SILBridging.cpp
2022-01-19 18:51:19 +00:00

80 lines
2.4 KiB
Swift

//===--- 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<BasicBlock> {
return List(first: SILFunction_firstBlock(bridged).block)
}
public var arguments: LazyMapSequence<ArgumentArray, FunctionArgument> {
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) }
}