File: Macros.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (179 lines) | stat: -rw-r--r-- 4,778 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import SwiftDiagnostics
import SwiftOperators
import SwiftSyntax
import SwiftSyntaxBuilder
import SwiftSyntaxMacros

public struct AddStructDeclMacro: DeclarationMacro {
  public static func expansion(
    of node: some FreestandingMacroExpansionSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return [
    """
    @AddExtension
    struct MacroAddedStruct {
      var macroAddedStructMember = 1
    }
    """
    ]
  }
}

public struct AddVarDeclMacro: DeclarationMacro {
  public static func expansion(
    of node: some FreestandingMacroExpansionSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return [
    """
    static let macroAddedVar = 2
    """
    ]
  }
}

public struct AddExtensionMacro: ExtensionMacro {
  public static func expansion(
    of node: AttributeSyntax,
    attachedTo declaration: some DeclGroupSyntax,
    providingExtensionsOf type: some TypeSyntaxProtocol,
    conformingTo protocols: [TypeSyntax],
    in context: some MacroExpansionContext
  ) throws -> [ExtensionDeclSyntax] {
    let typeName = declaration.declGroupName
    return protocols.map {
      ("""
      extension \(typeName): \($0) {
        struct _Extension_\($0): \($0) {
          var nested = 8
        }
      }
      """ as DeclSyntax)
      .cast(ExtensionDeclSyntax.self)
    } + [
    ("""
    extension \(typeName) {
      static let _extension_\(typeName) = 3
    }
    """ as DeclSyntax).cast(ExtensionDeclSyntax.self)
    ]
  }
}

public struct AddSpecificExtensionMacro: ExtensionMacro {
  public static func expansion(
    of node: AttributeSyntax,
    attachedTo declaration: some DeclGroupSyntax,
    providingExtensionsOf type: some TypeSyntaxProtocol,
    conformingTo protocols: [TypeSyntax],
    in context: some MacroExpansionContext
  ) throws -> [ExtensionDeclSyntax] {
    var extensions = [ExtensionDeclSyntax]()
    let protocolNames = Set(protocols.compactMap { $0.as(IdentifierTypeSyntax.self)?.name.text })
    if protocolNames.contains("MyProto") {
        extensions.append(try ExtensionDeclSyntax("extension \(type.trimmed): MyProto") { })
    }
    return extensions
  }
}

public struct AddPeerVarMacro: PeerMacro {
  public static func expansion(
    of node: AttributeSyntax,
    providingPeersOf declaration: some DeclSyntaxProtocol,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    let name = declaration.declName
    return [
    """
    static var _peer_\(name) = 4
    """
    ]
  }
}

public struct AddMemberMacro: MemberMacro {
  public static func expansion(
    of node: AttributeSyntax,
    providingMembersOf declaration: some DeclGroupSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    let typeName = declaration.declGroupName
    return [
    """
    static let _member_\(typeName) = 5
    """
    ]
  }
}

public struct AddMemberAttributeMacro: MemberAttributeMacro {
  public static func expansion(
    of node: AttributeSyntax,
    attachedTo declaration: some DeclGroupSyntax,
    providingAttributesFor member: some DeclSyntaxProtocol,
    in context: some MacroExpansionContext
  ) throws -> [AttributeSyntax] {
    if member.isProtocol(DeclGroupSyntax.self) {
      return ["@AddExtension"]
    }
    return ["@AddPeerVar"]
  }
}

public struct GetterMacro: AccessorMacro {
  public static func expansion(
    of node: AttributeSyntax,
    providingAccessorsOf declaration: some DeclSyntaxProtocol,
    in context: some MacroExpansionContext
  ) throws -> [AccessorDeclSyntax] {
    return ["get { 6 }"]
  }
}

public struct AddPeerStructMacro: PeerMacro {
  public static func expansion(
    of node: AttributeSyntax,
    providingPeersOf declaration: some DeclSyntaxProtocol,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    let name = declaration.declName
    return [
    """
    @AddExtension
    @AddMemberVar
    struct _Peer_\(name) {
      #AddMacroAddedVar
      
      @AddPeerVar
      var peerMacroVar = 7
    }
    """
    ]
  }
}

extension DeclGroupSyntax {
  var declGroupName: TokenSyntax {
    if let structDecl = self.as(StructDeclSyntax.self) {
      return structDecl.name.trimmed
    }
    fatalError("Not implemented")
  }
}

extension DeclSyntaxProtocol {
  var declName: TokenSyntax {
    if let varDecl = self.as(VariableDeclSyntax.self),
       let first = varDecl.bindings.first,
       let pattern = first.pattern.as(IdentifierPatternSyntax.self) {
      return pattern.identifier.trimmed
    } else if let funcDecl = self.as(FunctionDeclSyntax.self) {
      return funcDecl.name.trimmed
    } else if let structDecl = self.as(StructDeclSyntax.self) {
      return structDecl.name.trimmed
    }
    fatalError("Not implemented")
  }
}