From 75152f27be6d099523d2a3d42c9765ff31ab05f1 Mon Sep 17 00:00:00 2001 From: Erik Eckstein Date: Thu, 17 Apr 2025 12:35:02 +0200 Subject: [PATCH] Swift AST: make `Conformance` hashable and rename `var proto` -> `var protocol` --- SwiftCompilerSources/Sources/AST/Conformance.swift | 12 ++++++++++-- .../Optimizer/Utilities/GenericSpecialization.swift | 6 ++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/SwiftCompilerSources/Sources/AST/Conformance.swift b/SwiftCompilerSources/Sources/AST/Conformance.swift index 1d7510d9d21..f67c942924c 100644 --- a/SwiftCompilerSources/Sources/AST/Conformance.swift +++ b/SwiftCompilerSources/Sources/AST/Conformance.swift @@ -17,7 +17,7 @@ import ASTBridging /// members to the type (or extension) members that provide the functionality for the concrete type. /// /// TODO: Ideally, `Conformance` should be an enum -public struct Conformance: CustomStringConvertible, NoReflectionChildren { +public struct Conformance: CustomStringConvertible, Hashable, NoReflectionChildren { public let bridged: BridgedConformance public init(bridged: BridgedConformance) { @@ -28,6 +28,14 @@ public struct Conformance: CustomStringConvertible, NoReflectionChildren { 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 isValid: Bool { bridged.isValid() } @@ -37,7 +45,7 @@ public struct Conformance: CustomStringConvertible, NoReflectionChildren { return Type(bridged: bridged.getType()) } - public var proto: ProtocolDecl { + public var `protocol`: ProtocolDecl { return bridged.getRequirement().getAs(ProtocolDecl.self) } public var isSpecialized: Bool { diff --git a/SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift b/SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift index f0accdf72f4..929489e5b33 100644 --- a/SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift +++ b/SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift @@ -145,8 +145,10 @@ func specializeWitnessTable(forConformance conformance: Conformance, let substType = witness.subst(with: conformance.specializedSubstitutions) return .associatedType(requirement: requirement, witness: substType) case .associatedConformance(let requirement, let assocConf): - // FIXME: let concreteAssociateConf = assocConf.subst(with: conformance.specializedSubstitutions) - let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType, to: assocConf.proto) + // TODO: once we have the API, replace this with: + // let concreteAssociateConf = assocConf.subst(with: conformance.specializedSubstitutions) + let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType, + to: assocConf.protocol) if concreteAssociateConf.isSpecialized { specializeWitnessTable(forConformance: concreteAssociateConf, errorLocation: errorLocation,