File: RemoveUnusedReferencesTransformation.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 (30 lines) | stat: -rw-r--r-- 1,512 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
/*
 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
*/

/// A transformation that removes unused references from a render node.
public struct RemoveUnusedReferencesTransformation: RenderNodeTransforming {
    /// Initializes a new transformer.
    public init() {}
    
    /// Removes references that are unreferenced in a given context from the given render node.
    ///
    /// A reference is considered "unreferenced" if the reference count for that reference in the transformation context is zero.
    ///
    /// - Parameters:
    ///   - renderNode: The render node from which to remove unreferenced references.
    ///   - context: The context that the transformer uses to determine which references are unreferenced.
    /// - Returns: The transformed render node and the unmodified context.
    public func transform(renderNode: RenderNode, context: RenderNodeTransformationContext) -> RenderNodeTransformationResult {
        var renderNode = renderNode
        let topicReferencesToRemove = context.referencesCount.filter { _, value in value <= 0 }.map { key, _ in key }
        renderNode.references = renderNode.references.filter { key, _ in !topicReferencesToRemove.contains(key) }
        return (renderNode, context)
    }
}