blob: 990965890d95d919e1bde03c285fddc41edd69fd [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// An outcome of a condition checking operation.
class RefactoringStatus {
/// The current severity of this [RefactoringStatus] - the maximum of the
/// severities of its [entries].
RefactoringProblemSeverity? _severity;
/// A list of [RefactoringProblem]s.
final List<RefactoringProblem> problems = [];
/// Creates a new OK [RefactoringStatus].
RefactoringStatus();
/// Creates a new [RefactoringStatus] with the ERROR severity.
factory RefactoringStatus.error(String msg, [Location? location]) {
var status = RefactoringStatus();
status.addError(msg, location);
return status;
}
/// Creates a new [RefactoringStatus] with the FATAL severity.
factory RefactoringStatus.fatal(String msg, [Location? location]) {
var status = RefactoringStatus();
status.addFatalError(msg, location);
return status;
}
/// Creates a new [RefactoringStatus] with the WARNING severity.
factory RefactoringStatus.warning(String msg, [Location? location]) {
var status = RefactoringStatus();
status.addWarning(msg, location);
return status;
}
/// Returns `true` if the severity is FATAL or ERROR.
bool get hasError {
return _severity == RefactoringProblemSeverity.FATAL ||
_severity == RefactoringProblemSeverity.ERROR;
}
/// Returns `true` if the severity is FATAL.
bool get hasFatalError => _severity == RefactoringProblemSeverity.FATAL;
/// Returns `true` if the severity is WARNING.
bool get hasWarning => _severity == RefactoringProblemSeverity.WARNING;
/// Return `true` if the severity is `OK`.
bool get isOK => _severity == null;
/// Returns the message of the [RefactoringProblem] with highest severity;
/// may be `null` if no problems.
String? get message {
final problem = this.problem;
if (problem == null) {
return null;
}
return problem.message;
}
/// Returns the first [RefactoringProblem] with the highest severity.
///
/// Returns `null` if no entries.
RefactoringProblem? get problem {
for (var problem in problems) {
if (problem.severity == _severity) {
return problem;
}
}
return null;
}
/// Returns the current severity of this [RefactoringStatus].
RefactoringProblemSeverity? get severity => _severity;
/// Adds an ERROR problem with the given message and location.
void addError(String msg, [Location? location]) {
_addProblem(RefactoringProblem(RefactoringProblemSeverity.ERROR, msg,
location: location));
}
/// Adds a FATAL problem with the given message and location.
void addFatalError(String msg, [Location? location]) {
_addProblem(RefactoringProblem(RefactoringProblemSeverity.FATAL, msg,
location: location));
}
/// Merges [other] into this [RefactoringStatus].
///
/// The [other]'s entries are added to this.
///
/// The resulting severity is the more severe of this and [other] severities.
///
/// Merging with `null` is allowed - it has no effect.
void addStatus(RefactoringStatus? other) {
if (other == null) {
return;
}
problems.addAll(other.problems);
_severity = RefactoringProblemSeverity.max(_severity, other.severity);
}
/// Adds a WARNING problem with the given message and location.
void addWarning(String msg, [Location? location]) {
_addProblem(RefactoringProblem(RefactoringProblemSeverity.WARNING, msg,
location: location));
}
@override
String toString() {
var sb = StringBuffer();
sb.write('<');
var severity = _severity;
if (severity == null) {
sb.write('OK');
} else {
sb.write(severity.name);
}
if (!isOK) {
sb.write('\n');
for (var problem in problems) {
sb.write('\t');
sb.write(problem);
sb.write('\n');
}
}
sb.write('>');
return sb.toString();
}
/// Adds the given [RefactoringProblem] and updates [severity].
void _addProblem(RefactoringProblem problem) {
problems.add(problem);
// update maximum severity
var severity = problem.severity;
_severity = RefactoringProblemSeverity.max(_severity, severity);
}
}