File: DeclarationsRenderSection.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 (292 lines) | stat: -rw-r--r-- 12,304 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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See https://swift.org/LICENSE.txt for license information
 See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

import Foundation

/// A compound section that contains a list of declaration sections.
public struct DeclarationsRenderSection: RenderSection, Codable, Equatable {
    /// The section title, by default `nil`.
    public static var title: String? = nil
    
    public var kind: RenderSectionKind = .declarations
    /// The list of declaration sections.
    public var declarations: [DeclarationRenderSection]
    
    /// Creates a new declarations section.
    /// - Parameter declarations: The list of declaration sections to include.
    public init(declarations: [DeclarationRenderSection]) {
        self.declarations = declarations
    }
}

extension DeclarationsRenderSection: TextIndexing {
    public var headings: [String] {
        return []
    }
    
    public func rawIndexableTextContent(references: [String : RenderReference]) -> String {
        return ""
    }
}

// Diffable conformance
extension DeclarationsRenderSection: RenderJSONDiffable {
    /// Returns the differences between this DeclarationsRenderSection and the given one.
    func difference(from other: DeclarationsRenderSection, at path: CodablePath) -> JSONPatchDifferences {
        var diffBuilder = DifferenceBuilder(current: self, other: other, basePath: path)

        diffBuilder.addDifferences(atKeyPath: \.kind, forKey: CodingKeys.kind)
        diffBuilder.addDifferences(atKeyPath: \.declarations, forKey: CodingKeys.declarations)

        return diffBuilder.differences
    }
    
    /// Returns if this DeclarationsRenderSection is similar enough to the given one.
    func isSimilar(to other: DeclarationsRenderSection) -> Bool {
        return self.declarations == other.declarations
    }

}

/// A section that contains a symbol declaration.
public struct DeclarationRenderSection: Codable, Equatable {
    /// The platforms this declaration applies to.
    public let platforms: [PlatformName?]
    
    /// The list of declaration tokens that make up the declaration.
    ///
    /// For example, the declaration "var x: Int?" is comprised of a:
    ///  - "var" keyword token
    ///  - " x: " string token
    ///  - an "Int?" type-identifier token
    public let tokens: [Token]
    
    /// The programming languages that this declaration uses.
    public let languages: [String]?
    
    /// A lexical token to use in declarations.
    ///
    /// A lexical token is a string with an associated meaning in source code.
    /// For example, `123` is represented as a single token of kind "number".
    public struct Token: Codable, Hashable, Equatable {
        /// The token text content.
        public var text: String
        /// The token programming kind.
        public let kind: Kind
        
        /// The list of all expected tokens in a declaration.
        public enum Kind: String, Codable, RawRepresentable {
            /// A known keyword, like "class" or "var".
            case keyword
            /// An attribute, for example, "@main".
            case attribute
            /// A numeric literal, like "1.25" or "0xff".
            case number
            /// A string literal.
            case string
            /// An identifier, for example a property or a function name.
            case identifier
            /// A type identifier, for example, an integer or raw data.
            case typeIdentifier
            /// A generic parameter in a function signature.
            case genericParameter
            /// A plain text, such as whitespace or punctuation.
            case text
            /// A parameter name to use inside a function body.
            case internalParam
            /// A parameter name to use when calling a function.
            case externalParam
            /// A label that precedes an identifier.
            case label
        }
        
        /// If the token is a known symbol, its identifier.
        ///
        /// This value can be used to look up more information in the render node's ``RenderNode/references`` object.
        public let identifier: String?
        
        /// If the token is a known symbol, its precise identifier as vended in the symbol graph.
        public let preciseIdentifier: String?

        /// The kind of highlight the token should be rendered with.
        public var highlight: Highlight?

        /// The kinds of highlights that can be applied to a token.
        public enum Highlight: String, Codable, RawRepresentable {
            /// A highlight representing generalized change, not specifically added or removed.
            case changed
        }

        /// Creates a new declaration token with optional identifier and precise identifier.
        /// - Parameters:
        ///   - text: The text content of the token.
        ///   - kind: The kind of the token.
        ///   - identifier: If the token refers to a known symbol, its identifier.
        ///   - preciseIdentifier: If the refers to a symbol, its precise identifier.
        public init(
            text: String,
            kind: Kind,
            identifier: String? = nil,
            preciseIdentifier: String? = nil,
            highlight: Highlight? = nil
        ) {
            self.text = text
            self.kind = kind
            self.identifier = identifier
            self.preciseIdentifier = preciseIdentifier
            self.highlight = highlight
        }
        
        // MARK: - Codable
        
        private enum CodingKeys: CodingKey {
            case text, kind, identifier, preciseIdentifier, highlight, otherDeclarations
        }
        
        public func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            
            try container.encode(text, forKey: .text)
            try container.encode(kind, forKey: .kind)
            try container.encodeIfPresent(identifier, forKey: .identifier)
            try container.encodeIfPresent(preciseIdentifier, forKey: .preciseIdentifier)
            try container.encodeIfPresent(highlight, forKey: .highlight)
        }
        
        public init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            
            text = try container.decode(String.self, forKey: .text)
            kind = try container.decode(Kind.self, forKey: .kind)
            preciseIdentifier = try container.decodeIfPresent(String.self, forKey: .preciseIdentifier)
            identifier = try container.decodeIfPresent(String.self, forKey: .identifier)
            highlight = try container.decodeIfPresent(Highlight.self, forKey: .highlight)

            if let reference = identifier {
                decoder.registerReferences([reference])
            }
        }
    }
    
    /// Declarations for other symbols that are related to this one, e.g. overloads.
    public struct OtherDeclarations: Codable, Equatable {
        /// A displayable declaration for a different symbol that is connected to this one.
        public struct Declaration: Codable, Equatable {
            /// The symbol's declaration tokens.
            public let tokens: [Token]
            
            /// The symbol's identifier.
            public let identifier: String
            
            /// Creates a new other declaration for a symbol that is connected to this one, e.g. an overload.
            public init(tokens: [Token], identifier: String) {
                self.tokens = tokens
                self.identifier = identifier
            }
        }
        /// The displayable declarations for this symbol's overloads.
        let declarations: [Declaration]
        /// The index where this symbol's declaration should be displayed (inserted) among the declarations.
        let displayIndex: Int
        
        /// Creates a group of declarations for symbols that are connected to this one, e.g. overloads.
        public init(declarations: [Declaration], displayIndex: Int) {
            self.declarations = declarations
            self.displayIndex = displayIndex
        }
    }
    
    /// The declarations for this symbol's overloads.
    public let otherDeclarations: OtherDeclarations?
    
    public enum CodingKeys: CodingKey {
        case tokens
        case platforms
        case languages
        case otherDeclarations
    }
    
    /// Creates a new declaration section.
    /// - Parameters:
    ///   - languages: The source languages to which this declaration applies.
    ///   - platforms: The platforms to which this declaration applies.
    ///   - tokens: The list of declaration tokens.
    ///   - otherDeclarations: The declarations for this symbol's overloads.
    public init(languages: [String]?, platforms: [PlatformName?], tokens: [Token], otherDeclarations: OtherDeclarations? = nil) {
        self.languages = languages
        self.platforms = platforms
        self.tokens = tokens
        self.otherDeclarations = otherDeclarations
    }
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        tokens = try container.decode([Token].self, forKey: .tokens)
        platforms = try container.decode([PlatformName?].self, forKey: .platforms)
        languages = try container.decodeIfPresent([String].self, forKey: .languages)
        otherDeclarations = try container.decodeIfPresent(OtherDeclarations.self, forKey: .otherDeclarations)
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: DeclarationRenderSection.CodingKeys.self)
        try container.encode(self.tokens, forKey: DeclarationRenderSection.CodingKeys.tokens)
        try container.encode(self.platforms, forKey: DeclarationRenderSection.CodingKeys.platforms)
        try container.encode(self.languages, forKey: DeclarationRenderSection.CodingKeys.languages)
        try container.encodeIfPresent(self.otherDeclarations, forKey: DeclarationRenderSection.CodingKeys.otherDeclarations)
    }
}

extension DeclarationRenderSection: TextIndexing {
    public var headings: [String] {
        return []
    }

    public func rawIndexableTextContent(references: [String : RenderReference]) -> String {
        return ""
    }
}

// Diffable conformance
extension DeclarationRenderSection: RenderJSONDiffable {
    /// Returns the differences between this DeclarationRenderSection and the given one.
    func difference(from other: DeclarationRenderSection, at path: CodablePath) -> JSONPatchDifferences {
        var diffBuilder = DifferenceBuilder(current: self, other: other, basePath: path)

        diffBuilder.addDifferences(atKeyPath: \.platforms, forKey: CodingKeys.platforms)
        diffBuilder.addDifferences(atKeyPath: \.tokens, forKey: CodingKeys.tokens)
        diffBuilder.addDifferences(atKeyPath: \.languages, forKey: CodingKeys.languages)
        diffBuilder.addDifferences(atKeyPath: \.otherDeclarations, forKey: CodingKeys.otherDeclarations)

        return diffBuilder.differences
    }

    /// Returns if this DeclarationRenderSection is similar enough to the given one.
    func isSimilar(to other: DeclarationRenderSection) -> Bool {
        return self.tokens == other.tokens
    }
}

// Diffable conformance
extension DeclarationRenderSection.Token: RenderJSONDiffable {
    /// Returns the differences between this Token and the given one.
    func difference(from other: DeclarationRenderSection.Token, at path: CodablePath) -> JSONPatchDifferences {
        var diffBuilder = DifferenceBuilder(current: self, other: other, basePath: path)

        diffBuilder.addDifferences(atKeyPath: \.text, forKey: CodingKeys.text)
        diffBuilder.addDifferences(atKeyPath: \.kind, forKey: CodingKeys.kind)

        return diffBuilder.differences
    }

    /// Returns if this Token is similar enough to the given one.
    func isSimilar(to other: DeclarationRenderSection.Token) -> Bool {
        return self.text == other.text
    }
}