1+ // AssociatedType.swift
2+ // SyntaxKit
3+ //
4+ // Created by Leo Dion.
5+ //
6+ // Permission is hereby granted, free of charge, to any person
7+ // obtaining a copy of this software and associated documentation
8+ // files (the “Software”), to deal in the Software without
9+ // restriction, including without limitation the rights to use,
10+ // copy, modify, merge, publish, distribute, sublicense, and/or
11+ // sell copies of the Software, and to permit persons to whom the
12+ // Software is furnished to do so, subject to the following
13+ // conditions:
14+ //
15+ // The above copyright notice and this permission notice shall be
16+ // included in all copies or substantial portions of the Software.
17+ //
18+ // THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
19+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25+ // OTHER DEALINGS IN THE SOFTWARE.
26+ //
27+
28+ import SwiftSyntax
29+
30+ /// Represents an associatedtype requirement in a protocol.
31+ public struct AssociatedType : CodeBlock , Sendable {
32+ private let name : String
33+ private var inherited : [ String ] = [ ]
34+
35+ public init ( _ name: String ) {
36+ self . name = name
37+ }
38+
39+ /// Adds inherited protocols/constraints to the associatedtype.
40+ public func inherits( _ protocols: String ... ) -> Self {
41+ var copy = self
42+ copy. inherited. append ( contentsOf: protocols)
43+ return copy
44+ }
45+
46+ public var syntax : SyntaxProtocol {
47+ let associatedTypeKeyword = TokenSyntax . keyword ( . associatedtype, trailingTrivia: . space)
48+ let identifier = TokenSyntax . identifier ( name)
49+ var inheritanceClause : TypeInheritanceClauseSyntax ? = nil
50+ if !inherited. isEmpty {
51+ let joined = inherited. joined ( separator: " & " )
52+ let inheritedTypes = InheritedTypeListSyntax ( [
53+ InheritedTypeSyntax ( type: TypeSyntax ( IdentifierTypeSyntax ( name: . identifier( joined) ) ) )
54+ ] )
55+ inheritanceClause = TypeInheritanceClauseSyntax (
56+ colon: . colonToken( leadingTrivia: . space, trailingTrivia: . space) ,
57+ inheritedTypes: inheritedTypes
58+ )
59+ }
60+ return AssociatedTypeDeclSyntax (
61+ attributes: AttributeListSyntax ( [ ] ) ,
62+ modifiers: DeclModifierListSyntax ( [ ] ) ,
63+ associatedtypeKeyword: associatedTypeKeyword,
64+ name: identifier,
65+ inheritanceClause: inheritanceClause,
66+ initializer: nil ,
67+ genericWhereClause: nil
68+ )
69+ }
70+ }
0 commit comments