File: SWBBuildOperationBacktraceFrame.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (136 lines) | stat: -rw-r--r-- 4,654 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
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import SWBProtocol
import SWBUtil

public import Foundation

public struct SWBBuildOperationBacktraceFrame: Hashable, Sendable, Codable, Identifiable {
    public struct Identifier: Equatable, Hashable, Sendable, Codable, CustomDebugStringConvertible {
        private enum Storage: Equatable, Hashable, Sendable, Codable {
            case task(BuildOperationTaskSignature)
            case key(String)
        }
        private let storage: Storage

        init(messageIdentifier: BuildOperationBacktraceFrameEmitted.Identifier) {
            switch messageIdentifier {
            case .task(let signature):
                self.storage = .task(signature)
            case .genericBuildKey(let id):
                self.storage = .key(id)
            }
        }

        public init?(taskSignatureData: Data) {
            guard let taskSignature = BuildOperationTaskSignature(rawValue: ByteString(taskSignatureData)) else {
                return nil
            }
            self.storage = .task(taskSignature)
        }

        public var debugDescription: String {
            switch storage {
            case .task(let taskSignature):
                return taskSignature.debugDescription
            case .key(let key):
                return key
            }
        }
    }

    public enum Category: Equatable, Hashable, Sendable, Codable {
        case ruleNeverBuilt
        case ruleSignatureChanged
        case ruleHadInvalidValue
        case ruleInputRebuilt
        case ruleForced
        case dynamicTaskRegistration
        case dynamicTaskRequest
        case none

        public var isUserFacing: Bool {
            switch self {
            case .ruleNeverBuilt, .ruleSignatureChanged, .ruleHadInvalidValue, .ruleInputRebuilt, .ruleForced, .dynamicTaskRequest, .none:
                return true
            case .dynamicTaskRegistration:
                return false
            }
        }
    }
    public enum Kind: Equatable, Hashable, Sendable, Codable {
        case genericTask
        case swiftDriverJob
        case file
        case directory
        case unknown
    }

    public let identifier: Identifier
    public let previousFrameIdentifier: Identifier?
    public let category: Category
    public let description: String
    public let frameKind: Kind

    // The old name collides with the `kind` key used in the SwiftBuildMessage JSON encoding
    @available(*, deprecated, renamed: "frameKind")
    public var kind: Kind {
        frameKind
    }

    public var id: Identifier {
        identifier
    }
}

extension SWBBuildOperationBacktraceFrame {
    init(_ message: BuildOperationBacktraceFrameEmitted) {
        let id = SWBBuildOperationBacktraceFrame.Identifier(messageIdentifier: message.identifier)
        let previousID = message.previousFrameIdentifier.map { SWBBuildOperationBacktraceFrame.Identifier(messageIdentifier: $0) }
        let category: SWBBuildOperationBacktraceFrame.Category
        switch message.category {
        case .ruleNeverBuilt:
            category = .ruleNeverBuilt
        case .ruleSignatureChanged:
            category = .ruleSignatureChanged
        case .ruleHadInvalidValue:
            category = .ruleHadInvalidValue
        case .ruleInputRebuilt:
            category = .ruleInputRebuilt
        case .ruleForced:
            category = .ruleForced
        case .dynamicTaskRegistration:
            category = .dynamicTaskRegistration
        case .dynamicTaskRequest:
            category = .dynamicTaskRequest
        case .none:
            category = .none
        }
        let kind: SWBBuildOperationBacktraceFrame.Kind
        switch message.kind {
        case .genericTask:
            kind = .genericTask
        case .swiftDriverJob:
            kind = .swiftDriverJob
        case .directory:
            kind = .directory
        case .file:
            kind = .file
        case .unknown:
            kind = .unknown
        case nil:
            kind = .unknown
        }
        self.init(identifier: id, previousFrameIdentifier: previousID, category: category, description: message.description, frameKind: kind)
    }
}