Swift AST: make Conformance hashable and rename var proto -> var protocol

This commit is contained in:
Erik Eckstein
2025-04-17 12:35:02 +02:00
parent 1c9a7cd562
commit 75152f27be
2 changed files with 14 additions and 4 deletions

View File

@@ -17,7 +17,7 @@ import ASTBridging
/// members to the type (or extension) members that provide the functionality for the concrete type. /// members to the type (or extension) members that provide the functionality for the concrete type.
/// ///
/// TODO: Ideally, `Conformance` should be an enum /// TODO: Ideally, `Conformance` should be an enum
public struct Conformance: CustomStringConvertible, NoReflectionChildren { public struct Conformance: CustomStringConvertible, Hashable, NoReflectionChildren {
public let bridged: BridgedConformance public let bridged: BridgedConformance
public init(bridged: BridgedConformance) { public init(bridged: BridgedConformance) {
@@ -28,6 +28,14 @@ public struct Conformance: CustomStringConvertible, NoReflectionChildren {
return String(taking: bridged.getDebugDescription()) return String(taking: bridged.getDebugDescription())
} }
public func hash(into hasher: inout Hasher) {
hasher.combine(bridged.opaqueValue)
}
public static func ==(lhs: Conformance, rhs: Conformance) -> Bool {
lhs.bridged.opaqueValue == rhs.bridged.opaqueValue
}
public var isConcrete: Bool { bridged.isConcrete() } public var isConcrete: Bool { bridged.isConcrete() }
public var isValid: Bool { bridged.isValid() } public var isValid: Bool { bridged.isValid() }
@@ -37,7 +45,7 @@ public struct Conformance: CustomStringConvertible, NoReflectionChildren {
return Type(bridged: bridged.getType()) return Type(bridged: bridged.getType())
} }
public var proto: ProtocolDecl { public var `protocol`: ProtocolDecl {
return bridged.getRequirement().getAs(ProtocolDecl.self) return bridged.getRequirement().getAs(ProtocolDecl.self)
} }
public var isSpecialized: Bool { public var isSpecialized: Bool {

View File

@@ -145,8 +145,10 @@ func specializeWitnessTable(forConformance conformance: Conformance,
let substType = witness.subst(with: conformance.specializedSubstitutions) let substType = witness.subst(with: conformance.specializedSubstitutions)
return .associatedType(requirement: requirement, witness: substType) return .associatedType(requirement: requirement, witness: substType)
case .associatedConformance(let requirement, let assocConf): case .associatedConformance(let requirement, let assocConf):
// FIXME: let concreteAssociateConf = assocConf.subst(with: conformance.specializedSubstitutions) // TODO: once we have the API, replace this with:
let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType, to: assocConf.proto) // let concreteAssociateConf = assocConf.subst(with: conformance.specializedSubstitutions)
let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType,
to: assocConf.protocol)
if concreteAssociateConf.isSpecialized { if concreteAssociateConf.isSpecialized {
specializeWitnessTable(forConformance: concreteAssociateConf, specializeWitnessTable(forConformance: concreteAssociateConf,
errorLocation: errorLocation, errorLocation: errorLocation,