File: XCStringsInputFileGroupingStrategy.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 (49 lines) | stat: -rw-r--r-- 2,511 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
//===----------------------------------------------------------------------===//
//
// 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 SWBCore
import SWBUtil

/// A grouping strategy that places each xcstrings table in its own group, along with any other .strings or .stringsdicts with the same basename.
///
/// Having .xcstrings and .strings with the same basename in the same target is currently an unsupported configuration, so we group them to be able to diagnose that error downstream.
/// This also enables us to catch issues where more than one same-named .xcstrings file exists in the same target. That would ordinarily cause an error downstream, but is not guaranteed if the files contain only strings that don't actually need to build.
@_spi(Testing) public final class XCStringsInputFileGroupingStrategy: InputFileGroupingStrategy {

    let toolName: String

    @_spi(Testing) public init(toolName: String) {
        self.toolName = toolName
    }

    public func determineGroupIdentifier(groupable: any InputFileGroupable) -> String? {
        // Each xcstrings table gets its own group.
        return "tool:\(toolName) name:\(groupable.absolutePath.basenameWithoutSuffix)"
    }

    public func groupAdditionalFiles<S>(to target: FileToBuildGroup, from source: S, context: any InputFileGroupingStrategyContext) -> [FileToBuildGroup] where S : Sequence, S.Element == FileToBuildGroup {
        // Additionally include .strings and .stringsdict files with the same basename.

        guard let xcstringsBasenameWithoutSuffix = Set(target.files.map({ $0.absolutePath.basenameWithoutSuffix })).only else {
            assertionFailure("Expected same-named xcstrings files in \(target.files).")
            return []
        }

        let stringsFileTypes = ["text.plist.strings", "text.plist.stringsdict"].map { context.lookupFileType(identifier: $0)! }
        return source.filter { group in
            group.files.contains { file in
                file.fileType.conformsToAny(stringsFileTypes) && file.absolutePath.basenameWithoutSuffix == xcstringsBasenameWithoutSuffix
            }
        }
    }

}