mirror of
https://github.com/realm/SwiftLint.git
synced 2026-06-06 20:18:40 +00:00
With the binding of configurations to their associated rule types "unknown configuration" errors can be made more specific mentioning also the rule's identifier in the printed message.
120 lines
4.6 KiB
Swift
120 lines
4.6 KiB
Swift
import Foundation
|
|
|
|
/// All possible SwiftLint issues which are printed as warnings by default.
|
|
public enum Issue: LocalizedError, Equatable {
|
|
/// The configuration didn't match internal expectations.
|
|
case unknownConfiguration(ruleID: String)
|
|
|
|
/// Rule is listed multiple times in the configuration.
|
|
case listedMultipleTime(ruleID: String, times: Int)
|
|
|
|
/// An identifier `old` has been renamed to `new`.
|
|
case renamedIdentifier(old: String, new: String)
|
|
|
|
/// Configuration for a rule is invalid.
|
|
case invalidConfiguration(ruleID: String)
|
|
|
|
/// Some configuration keys are invalid.
|
|
case invalidConfigurationKeys([String])
|
|
|
|
/// A generic warning specified by a string.
|
|
case genericWarning(String)
|
|
|
|
/// A generic error specified by a string.
|
|
case genericError(String)
|
|
|
|
/// A deprecation warning for a rule.
|
|
case ruleDeprecated(ruleID: String)
|
|
|
|
/// The initial configuration file was not found.
|
|
case initialFileNotFound(path: String)
|
|
|
|
/// The file at `path` is not readable or cannot be opened.
|
|
case fileNotReadable(path: String?, ruleID: String)
|
|
|
|
/// The file at `path` is not writable.
|
|
case fileNotWritable(path: String)
|
|
|
|
/// The file at `path` cannot be indexed by a specific rule.
|
|
case indexingError(path: String?, ruleID: String)
|
|
|
|
/// No arguments were provided to compile a file at `path` within a specific rule.
|
|
case missingCompilerArguments(path: String?, ruleID: String)
|
|
|
|
/// Cursor information cannot be extracted from a specific location.
|
|
case missingCursorInfo(path: String?, ruleID: String)
|
|
|
|
/// An error that occurred when parsing YAML.
|
|
case yamlParsing(String)
|
|
|
|
/// Wraps any `Error` into a `SwiftLintError.genericWarning` if it is not already a `SwiftLintError`.
|
|
///
|
|
/// - parameter error: Any `Error`.
|
|
///
|
|
/// - returns: A `SwiftLintError.genericWarning` containig the message of the `error` argument.
|
|
static func wrap(error: Error) -> Self {
|
|
error as? Issue ?? Self.genericWarning(error.localizedDescription)
|
|
}
|
|
|
|
/// Make this issue an error.
|
|
var asError: Self {
|
|
Self.genericError(message)
|
|
}
|
|
|
|
/// The issues description which is ready to be printed to the console.
|
|
var errorDescription: String {
|
|
switch self {
|
|
case .genericError:
|
|
return "error: \(message)"
|
|
case .genericWarning:
|
|
return "warning: \(message)"
|
|
default:
|
|
return Self.genericWarning(message).errorDescription
|
|
}
|
|
}
|
|
|
|
/// Print the issue to the console.
|
|
public func print() {
|
|
queuedPrintError(errorDescription)
|
|
}
|
|
|
|
private var message: String {
|
|
switch self {
|
|
case let .unknownConfiguration(id):
|
|
return "Invalid configuration for '\(id)' rule. Falling back to default."
|
|
case let .listedMultipleTime(id, times):
|
|
return "'\(id)' is listed \(times) times in the configuration."
|
|
case let .renamedIdentifier(old, new):
|
|
return "'\(old)' has been renamed to '\(new)' and will be completely removed in a future release."
|
|
case let .invalidConfiguration(id):
|
|
return "Invalid configuration for '\(id)'. Falling back to default."
|
|
case let .invalidConfigurationKeys(keys):
|
|
return "Configuration contains invalid keys \(keys.joined(separator: ", "))."
|
|
case let .genericWarning(message), let .genericError(message):
|
|
return message
|
|
case let .ruleDeprecated(id):
|
|
return """
|
|
The `\(id)` rule is now deprecated and will be \
|
|
completely removed in a future release.
|
|
"""
|
|
case let .initialFileNotFound(path):
|
|
return "Could not read file at path '\(path)'."
|
|
case let .fileNotReadable(path, id):
|
|
return "Cannot open or read file at path '\(path ?? "...")' within '\(id)' rule."
|
|
case let .fileNotWritable(path):
|
|
return "Cannot write to file at path '\(path)'."
|
|
case let .indexingError(path, id):
|
|
return "Cannot index file at path '\(path ?? "...")' within '\(id)' rule."
|
|
case let .missingCompilerArguments(path, id):
|
|
return """
|
|
Attempted to lint file at path '\(path ?? "...")' within '\(id)' rule \
|
|
without any compiler arguments.
|
|
"""
|
|
case let .missingCursorInfo(path, id):
|
|
return "Cannot get cursor info from file at path '\(path ?? "...")' within '\(id)' rule."
|
|
case let .yamlParsing(message):
|
|
return "Cannot parse YAML file: \(message)"
|
|
}
|
|
}
|
|
}
|