// In the standard library extension Equatable { macro(contexts: [.conformance], external: "MyMacros.EquatableSynthesis") static func ==(lhs: Self, rhs: Self) -> Bool } // In the macro definition library struct EquatableSynthesis: ConformanceMacro { public static func apply( conformingType: TypeDecl, protocol: ProtocolDecl, witness: FunctionDeclSyntax, in context: MacroEvaluationContext ) -> (FunctionDeclSyntax, [Diagnostic]) { let comparisons: [ExprSyntax] = conformingType.storedProperties.map { property in "lhs.\(property.name) == rhs.\(property.name)" } let comparisonExpr: ExprSyntax = comparisons.map { $0.description }.joined(separator: " && ") return witness.withBody( """ { return \(comparisonExpr) } """ ) } }