File: Problem.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 (80 lines) | stat: -rw-r--r-- 3,211 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
/*
 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 SymbolKit

/**
 A problem with a document along with possible solutions to the problem.
 */
public struct Problem {
    /// A diagnostic describing the problem.
    public var diagnostic: Diagnostic
    
    /// The possible solutions to the problem if there are any.
    public var possibleSolutions: [Solution]
    public init(diagnostic: Diagnostic, possibleSolutions: some Sequence<Solution>) {
        self.diagnostic = diagnostic
        self.possibleSolutions = Array(possibleSolutions)
    }

    public init(diagnostic: Diagnostic) {
        self.init(diagnostic: diagnostic, possibleSolutions: [])
    }
}

extension Problem {
    /// Offsets the problem using a certain SymbolKit `SourceRange`.
    ///
    /// Useful when validating a doc comment that needs to be projected in its containing file "space".
    mutating func offsetWithRange(_ docRange: SymbolGraph.LineList.SourceRange) {
        diagnostic.offsetWithRange(docRange)
        
        for i in possibleSolutions.indices {
            for j in possibleSolutions[i].replacements.indices {
                possibleSolutions[i].replacements[j].offsetWithRange(docRange)
            }
        }
    }
}

extension Sequence<Problem> {
    /// Returns `true` if there are problems with diagnostics with `error` severity.
    public var containsErrors: Bool {
        return self.contains {
            $0.diagnostic.severity == .error
        }
    }
}

// MARK: Deprecated

extension Problem {
    @available(*, deprecated, message: "Use 'DiagnosticConsoleWriter.formattedDescription(for:options:)' instead. This deprecated API will be removed after 5.10 is released")
    var localizedDescription: String {
        return DiagnosticConsoleWriter.formattedDescription(for: self)
    }

    @available(*, deprecated, message: "Use 'DiagnosticConsoleWriter.formattedDescription(for:options:)' instead. This deprecated API will be removed after 5.10 is released")
    func formattedLocalizedDescription(withOptions options: DiagnosticFormattingOptions = []) -> String {
        return DiagnosticConsoleWriter.formattedDescription(for: self, options: options)
    }
}

extension Sequence where Element == Problem {
    @available(*, deprecated, message: "Use 'DiagnosticConsoleWriter.formattedDescription(for:options:)' instead. This deprecated API will be removed after 5.10 is released")
    public var localizedDescription: String {
        return map { $0.localizedDescription }.joined(separator: "\n")
    }

    @available(*, deprecated, message: "Use 'DiagnosticConsoleWriter.formattedDescription(for:options:)' instead. This deprecated API will be removed after 5.10 is released")
    public func formattedLocalizedDescription(withOptions options: DiagnosticFormattingOptions) -> String {
        return map { $0.formattedLocalizedDescription(withOptions: options) }.joined(separator: "\n")
    }
}