File: BuildFile.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 (131 lines) | stat: -rw-r--r-- 5,435 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
//===----------------------------------------------------------------------===//
//
// 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 Foundation
import SWBProtocol

extension ProjectModel {
    /// A build file, representing the membership of either a file or target product reference in a build phase.
    public struct BuildFile: Sendable, Hashable, Identifiable {
        public enum Ref: Sendable, Hashable {
            case reference(id: GUID)
            case targetProduct(id: GUID)
        }
        public enum HeaderVisibility: String, Sendable, Hashable {
            case `public` = "public"
            case `private` = "private"
        }
        public enum GeneratedCodeVisibility: String, Sendable, Hashable, Codable {
            case `public`
            case `private`
            case project
            case noCodegen = "no_codegen"
        }
        public enum ResourceRule: String, Sendable, Hashable, Codable {
            case process
            case copy
            case embedInCode
        }

        public let id: GUID
        public var ref: Ref
        public var headerVisibility: HeaderVisibility? = nil
        public var generatedCodeVisibility: GeneratedCodeVisibility? = nil
        public var platformFilters: Set<PlatformFilter> = []
        public var codeSignOnCopy: Bool = false
        public var removeHeadersOnCopy: Bool = false
        public var resourceRule: ResourceRule? = nil

        public init(
            id: GUID,
            ref: Ref,
            headerVisibility: HeaderVisibility? = nil,
            generatedCodeVisibility: GeneratedCodeVisibility? = nil,
            platformFilters: Set<PlatformFilter> = [],
            codeSignOnCopy: Bool = false,
            removeHeadersOnCopy: Bool = false,
            resourceRule: ResourceRule? = nil
        ) {
            self.id = id
            self.ref = ref
            self.headerVisibility = headerVisibility
            self.generatedCodeVisibility = generatedCodeVisibility
            self.platformFilters = platformFilters
            self.codeSignOnCopy = codeSignOnCopy
            self.removeHeadersOnCopy = removeHeadersOnCopy
        }

        public init(
            id: GUID,
            fileRef: FileReference,
            headerVisibility: HeaderVisibility? = nil,
            generatedCodeVisibility: GeneratedCodeVisibility? = nil,
            platformFilters: Set<PlatformFilter> = [],
            codeSignOnCopy: Bool = false,
            removeHeadersOnCopy: Bool = false,
            resourceRule: ResourceRule? = nil
        ) {
            self.init(id: id, ref: .reference(id: fileRef.id), headerVisibility: headerVisibility, generatedCodeVisibility: generatedCodeVisibility, platformFilters: platformFilters, codeSignOnCopy: codeSignOnCopy, removeHeadersOnCopy: removeHeadersOnCopy, resourceRule: resourceRule)
        }
    }
}


extension ProjectModel.BuildFile: Codable {
    public init(from decoder: any Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(ProjectModel.GUID.self, forKey: .guid)
        self.platformFilters = try container.decode(Set<ProjectModel.PlatformFilter>.self, forKey: .platformFilters)

        if let refId = try container.decodeIfPresent(ProjectModel.GUID.self, forKey: .fileReference) {
            self.ref = .reference(id: refId)
        } else if let refId = try container.decodeIfPresent(ProjectModel.GUID.self, forKey: .targetReference) {
            self.ref = .targetProduct(id: refId)
        } else {
            throw DecodingError.dataCorruptedError(forKey: .fileReference, in: container, debugDescription: "Missing file or target reference")
        }

    }
    
    public func encode(to encoder: any Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.id, forKey: .guid)
        try container.encode(self.platformFilters, forKey: .platformFilters)

        switch self.ref {
        case .reference(id: let refId):
            try container.encode(refId, forKey: .fileReference)
            try container.encodeIfPresent(self.headerVisibility?.rawValue, forKey: .headerVisibility)
            try container.encode(self.codeSignOnCopy ? "true" : "false", forKey: .codeSignOnCopy)
            try container.encode(self.removeHeadersOnCopy ? "true" : "false", forKey: .removeHeadersOnCopy)
            try container.encodeIfPresent(self.generatedCodeVisibility, forKey: .intentsCodegenVisibility)
            try container.encodeIfPresent(self.resourceRule, forKey: .resourceRule)

        case .targetProduct(id: let refId):
            try container.encode(refId, forKey: .targetReference)
        }
    }

    enum CodingKeys: String, CodingKey {
        case guid
        case fileReference
        case headerVisibility
        case platformFilters
        case codeSignOnCopy
        case removeHeadersOnCopy
        case intentsCodegenVisibility
        case resourceRule
        case targetReference
    }
}