From 2feafb86b665f4e094f014fe9a8b6c1bd5521004 Mon Sep 17 00:00:00 2001 From: mlch911 Date: Wed, 12 Feb 2025 10:40:23 +0800 Subject: [PATCH 1/2] Fix Bug: inherit from NSObject --- Sources/Macros/Singleton/SingletonMacro.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/Macros/Singleton/SingletonMacro.swift b/Sources/Macros/Singleton/SingletonMacro.swift index 94b9bf1..9e32c7c 100644 --- a/Sources/Macros/Singleton/SingletonMacro.swift +++ b/Sources/Macros/Singleton/SingletonMacro.swift @@ -14,7 +14,18 @@ struct SingletonMacro: MemberMacro { let nameOfDecl = try name(providingMembersOf: declaration).text let isPublic = declaration.modifiers.map(\.name.tokenKind.keyword).contains(.public) - let initializer = try InitializerDeclSyntax("private init()") {} + + // 检查是否继承自NSObject + let inheritsFromNSObject = if let classDecl = declaration.as(ClassDeclSyntax.self) { + classDecl.inheritanceClause?.inheritedTypes.contains { type in + type.type.as(IdentifierTypeSyntax.self)?.name.text == "NSObject" + } ?? false + } else { + false + } + + // 根据是否继承NSObject决定init方法是否需要override + let initializer = try InitializerDeclSyntax(inheritsFromNSObject ? "private override init()" : "private init()") {} let shared = "\(isPublic ? "public" : "") static let shared = \(nameOfDecl)()" From 9b44492cf47db0b58be8d372b0b82d3556edc1b6 Mon Sep 17 00:00:00 2001 From: mlch911 Date: Fri, 19 Dec 2025 09:45:02 +0800 Subject: [PATCH 2/2] fix build in Linux --- Package.swift | 3 ++- Sources/Macros/Plugins.swift | 17 +++++++++++------ Sources/Macros/Symbol/SymbolMacro.swift | 12 ++++++++++-- Sources/SwiftMacros/SwiftMacros.swift | 2 ++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Package.swift b/Package.swift index 0cd7058..2808417 100644 --- a/Package.swift +++ b/Package.swift @@ -7,7 +7,8 @@ import CompilerPluginSupport let package = Package( name: "SwiftMacros", platforms: [ - .macOS(.v12) + .macOS(.v12), + .iOS(.v13), ], products: [ .library( diff --git a/Sources/Macros/Plugins.swift b/Sources/Macros/Plugins.swift index 5279169..42d046e 100644 --- a/Sources/Macros/Plugins.swift +++ b/Sources/Macros/Plugins.swift @@ -3,10 +3,15 @@ import SwiftSyntaxMacros @main struct Plugins: CompilerPlugin { - let providingMacros: [Macro.Type] = [ - URLMacro.self, - SymbolMacro.self, - AssociatedValuesMacro.self, - SingletonMacro.self - ] + let providingMacros: [Macro.Type] = { + var macros: [Macro.Type] = [ + URLMacro.self, + AssociatedValuesMacro.self, + SingletonMacro.self, + ] +#if canImport(UIKit) || canImport(AppKit) + macros.append(SymbolMacro.self) +#endif + return macros + }() } diff --git a/Sources/Macros/Symbol/SymbolMacro.swift b/Sources/Macros/Symbol/SymbolMacro.swift index cc60784..8059711 100644 --- a/Sources/Macros/Symbol/SymbolMacro.swift +++ b/Sources/Macros/Symbol/SymbolMacro.swift @@ -1,6 +1,13 @@ import SwiftSyntaxMacros import SwiftSyntax -import SwiftUI + +#if canImport(UIKit) || canImport(AppKit) +#if canImport(UIKit) +import UIKit +#endif +#if canImport(AppKit) +import AppKit +#endif struct SymbolMacro: ExpressionMacro { static func expansion( @@ -23,9 +30,10 @@ struct SymbolMacro: ExpressionMacro { private static func verifySymbol(name: String) throws { #if canImport(UIKit) if let _ = UIImage(systemName: name) { return } - #else + #elseif canImport(AppKit) if let _ = NSImage(systemSymbolName: name, accessibilityDescription: nil) { return } #endif throw SymbolMacroError.invalidSymbol(name: name) } } +#endif diff --git a/Sources/SwiftMacros/SwiftMacros.swift b/Sources/SwiftMacros/SwiftMacros.swift index 17e354d..9bc0fce 100644 --- a/Sources/SwiftMacros/SwiftMacros.swift +++ b/Sources/SwiftMacros/SwiftMacros.swift @@ -3,8 +3,10 @@ import Foundation @freestanding(expression) public macro URL(_ string: String) -> URL = #externalMacro(module: "Macros", type: "URLMacro") +#if canImport(UIKit) || canImport(AppKit) @freestanding(expression) public macro symbol(_ name: String) -> String = #externalMacro(module: "Macros", type: "SymbolMacro") +#endif @attached(member, names: arbitrary) public macro AssociatedValues() = #externalMacro(module: "Macros", type: "AssociatedValuesMacro")