File: AttributesSectionTranslator.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 (78 lines) | stat: -rw-r--r-- 3,750 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
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2024 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
import SymbolKit

/// Translates a symbol's constraints and details into a render node's Attributes section.
struct AttributesSectionTranslator: RenderSectionTranslator {
    func translateSection(
        for symbol: Symbol,
        renderNode: inout RenderNode,
        renderNodeTranslator: inout RenderNodeTranslator
    ) -> VariantCollection<CodableContentSection?>? {
        translateSectionToVariantCollection(
            documentationDataVariants: symbol.attributesVariants
        ) { _, attributes in
            guard !attributes.isEmpty else { return nil }
            
            func translateFragments(_ fragments: [SymbolGraph.Symbol.DeclarationFragments.Fragment]) -> [DeclarationRenderSection.Token] {
                return fragments.map { fragment in
                    let reference: ResolvedTopicReference?
                    if let preciseIdentifier = fragment.preciseIdentifier,
                       let resolved = renderNodeTranslator.context.localOrExternalReference(symbolID: preciseIdentifier)
                    {
                        reference = resolved
                        renderNodeTranslator.collectedTopicReferences.append(resolved)
                    } else {
                        reference = nil
                    }

                    // Add the declaration token
                    return DeclarationRenderSection.Token(fragment: fragment, identifier: reference?.absoluteString)
                }
            }
            
            return AttributesRenderSection(
                title: "Attributes",
                attributes: attributes.compactMap { kind, attribute in
                    
                    switch (kind, attribute) {
                    case (.minimum, let value as SymbolGraph.AnyNumber):
                        return RenderAttribute.minimum(String(value))
                    case (.maximum, let value as SymbolGraph.AnyNumber):
                        return RenderAttribute.maximum(String(value))
                    case (.minimumExclusive, let value as SymbolGraph.AnyNumber):
                        return RenderAttribute.minimumExclusive(String(value))
                    case (.maximumExclusive, let value as SymbolGraph.AnyNumber):
                        return RenderAttribute.maximumExclusive(String(value))
                    case (.minimumLength, let value as Int):
                        return RenderAttribute.minimumLength(String(value))
                    case (.maximumLength, let value as Int):
                        return RenderAttribute.maximumLength(String(value))
                    case (.default, let value as SymbolGraph.AnyScalar):
                        return RenderAttribute.default(String(value))
                    case (.allowedTypes, let types as [SymbolGraph.Symbol.TypeDetail]):
                        let tokens = types.compactMap { $0.fragments.map(translateFragments) }
                        return RenderAttribute.allowedTypes(tokens)
                    case (.allowedValues, let values as [SymbolGraph.AnyScalar]):
                        let stringValues = values.map { String($0) }
                        return RenderAttribute.allowedValues(stringValues)
                    default:
                        return nil
                    }
                    
                }.sorted { $0.title < $1.title }
            )
        }
    }
    
    
}