File: DocumentationCoverageOptionsArgument.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 (104 lines) | stat: -rw-r--r-- 4,856 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
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021-2023 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
*/

import ArgumentParser
import Foundation
import SwiftDocC

/// Resolves and validates the arguments needed to enable the documentation coverage feature.
///
/// These options are used by the ``Docc/Convert`` subcommand.
public struct DocumentationCoverageOptionsArgument: ParsableArguments {
    public init() {}

    fileprivate static let noCoverage = DocumentationCoverageOptionsArgument()

    // The way the '--experimental-documentation-coverage' flag and the '--coverage-summary-level' option work together
    // doesn't match the possible values for `DocumentationCoverageLevel`.
    
    @Flag(
        help: ArgumentHelp("Generate documentation coverage output.", discussion: """
        Detailed documentation coverage information will be written to 'documentation-coverage.json' in the output directory.
        """)
    )
    var experimentalDocumentationCoverage: Bool = false

    /// The desired level of documentation coverage. Options are `none`, `brief`, and `detailed`. The default is `.brief`
    @Option(
        name: .customLong("coverage-summary-level"),
        help: ArgumentHelp("The level of documentation coverage information to write on standard out.", discussion: """
        The '--coverage-summary-level' level has no impact on the information in the 'documentation-coverage.json' file.
        The supported coverage summary levels are 'brief' and 'detailed'.
        """,
        valueName: "symbol-kind")
    )
    var summaryLevel: DocumentationCoverageLevel = .brief
    
    @Option(help: .hidden)
    @available(*, deprecated, renamed: "summaryLevel", message: "Use 'summaryLevel' instead. This deprecated API will be removed after 5.12 is released")
    public var level: DocumentationCoverageLevel = .none

    var effectiveSummaryLevel: DocumentationCoverageLevel {
        guard experimentalDocumentationCoverage else {
            return .none
        }
        switch summaryLevel {
        case .detailed:
            return .detailed
        case .none, .brief:
            return .brief
        }
    }
    
    @Option(
        name: .customLong("coverage-symbol-kind-filter"),
        parsing: ArrayParsingStrategy.upToNextOption,
        help: ArgumentHelp("Filter documentation coverage to only analyze symbols of the specified symbol kinds.", discussion: """
        Specify a list of symbol kind values to filter the documentation coverage to only those types symbols.
        The supported symbol kind values are: \ 
        \(DocumentationCoverageOptions.KindFilterOptions.BitFlagRepresentation.allValueStrings.sorted().joined(separator: ", "))
        """,
        valueName: "symbol-kind")
    )
    public var symbolKindFilter: [DocumentationCoverageOptions.KindFilterOptions.BitFlagRepresentation] = []
    
    @Option(parsing: ArrayParsingStrategy.upToNextOption, help: .hidden)
    @available(*, deprecated, renamed: "symbolKindFilter", message: "Use 'symbolKindFilter' instead. This deprecated API will be removed after 5.12 is released")
    public var kinds: [DocumentationCoverageOptions.KindFilterOptions.BitFlagRepresentation] = []
    
    @available(*, deprecated) // This deprecation silences the access of the deprecated `level` and `kind` options.
    public mutating func validate() throws {
        Docc.Convert.warnAboutDeprecatedOptionIfNeeded("level", message: "Use '--coverage-summary-level' instead.")
        Docc.Convert.warnAboutDeprecatedOptionIfNeeded("kinds", message: "Use '--coverage-symbol-kind-filter' instead.")
        
        if !ProcessInfo.processInfo.arguments.contains("--coverage-summary-level"), level != .none {
            summaryLevel = level
        }
        symbolKindFilter.append(contentsOf: kinds)
    }
}

// SwiftDocCUtilities imports SwiftDocC. SwiftDocC does not link against ArgumentParser (because it isn't about CLI). We conform here because this is the first place that we can. We implement in DocC.
extension DocumentationCoverageLevel: ExpressibleByArgument {}
extension DocumentationCoverageOptions.KindFilterOptions.BitFlagRepresentation: ExpressibleByArgument {}

extension DocumentationCoverageOptions {
    public init(from arguments: DocumentationCoverageOptionsArgument) {
        guard arguments.experimentalDocumentationCoverage else {
            self = .noCoverage
            return
        }
        
        self = DocumentationCoverageOptions(
            level: arguments.effectiveSummaryLevel,
            kindFilterOptions: .init(bitFlags: arguments.symbolKindFilter)
        )
    }
}