File: ModuleVerifierModuleMapFileVerifier.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 (82 lines) | stat: -rw-r--r-- 4,021 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
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

public import SWBUtil

public struct ModuleVerifierModuleMapFileVerifier {
    public static func verify(framework: ModuleVerifierFramework) -> (verifyPublic: Bool, verifyPrivate: Bool, diagnostics: [Diagnostic]) {
        var diagnostics: [Diagnostic] = []
        var verifyPublic = true
        var verifyPrivate = true

        if framework.hasPublicHeaders && framework.publicModuleMap == nil {
            diagnostics.append(self.moduleMapMissing(kind: .publicModule, framework: framework))
            verifyPublic = false
        }

        if framework.hasPrivateHeaders && framework.privateModuleMap == nil {
            diagnostics.append(self.moduleMapMissing(kind: .privateModule, framework: framework))
            verifyPrivate = false
        }

        if let publicModuleMap = framework.publicModuleMap {
            let publicDiagnostics = self.moduleMapCheck(moduleMapKind: .publicModule,
                                                        path: publicModuleMap.path,
                                                        hasHeaders: framework.hasPublicHeaders,
                                                        modulesCount: publicModuleMap.modulesHaveContents ? publicModuleMap.modules.count : 0)

            if publicDiagnostics.count > 0 {
                verifyPublic = false
                diagnostics.append(contentsOf: publicDiagnostics)
            }
        }

        if let privateModuleMap = framework.privateModuleMap {
            let privateDiagnostics = self.moduleMapCheck(moduleMapKind: .privateModule,
                                                         path: privateModuleMap.path,
                                                         hasHeaders: framework.hasPrivateHeaders,
                                                         modulesCount: privateModuleMap.modules.count)

            if privateDiagnostics.count > 0 {
                verifyPrivate = false
                diagnostics.append(contentsOf: privateDiagnostics)
            }
        }

        return (verifyPublic, verifyPrivate, diagnostics)
    }

    private static func moduleMapCheck(moduleMapKind:ModuleMapKind, path: Path, hasHeaders: Bool, modulesCount: Int) -> [Diagnostic] {
        // Xcode currently does not properly support a framework with only private headers being modularized
        // In order to make it work an empty module map has to be supplied which will throw a bunch of errors unless we bail early
        if moduleMapKind == .publicModule && !hasHeaders && modulesCount == 0 {
            return []
        }

        var diagnostics: [Diagnostic] = []

        if !hasHeaders {
            let message = "\(moduleMapKind.rawValue) module exists but no \(moduleMapKind.rawValue) headers"
            diagnostics.append(Diagnostic(behavior: .error, location: .path(path), data: DiagnosticData(message)))
        }
        if modulesCount == 0 {
            let message = "module map does not declare a module"
            diagnostics.append(Diagnostic(behavior: .error, location: .path(path), data: DiagnosticData(message)))
        }
        return diagnostics
    }

    private static func moduleMapMissing(kind: ModuleMapKind, framework: ModuleVerifierFramework) -> Diagnostic {
        let message = "module map is missing; there are \(kind.rawValue) headers but no module map"
        return Diagnostic(behavior: .warning, location: .path(ModuleVerifierModuleMap.preferredMap(kind, framework: framework)), data: DiagnosticData(message))
    }
}