diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index a5f008086ef..1c625b41812 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -124,12 +124,20 @@ class Doctor { for (DoctorValidator validator in validators) { final ValidationResult result = await validator.validate(); buffer.write('${result.leadingBox} ${validator.title} is '); - if (result.type == ValidationType.missing) - buffer.write('not installed.'); - else if (result.type == ValidationType.partial) - buffer.write('partially installed; more components are available.'); - else - buffer.write('fully installed.'); + switch (result.type) { + case ValidationType.missing: + buffer.write('not installed.'); + break; + case ValidationType.partial: + buffer.write('partially installed; more components are available.'); + break; + case ValidationType.notAvailable: + buffer.write('not available.'); + break; + case ValidationType.installed: + buffer.write('fully installed.'); + break; + } if (result.statusInfo != null) buffer.write(' (${result.statusInfo})'); @@ -171,11 +179,17 @@ class Doctor { } status.stop(); - if (result.type == ValidationType.missing) { - doctorResult = false; - } - if (result.type != ValidationType.installed) { - issues += 1; + switch (result.type) { + case ValidationType.missing: + doctorResult = false; + issues += 1; + break; + case ValidationType.partial: + case ValidationType.notAvailable: + issues += 1; + break; + case ValidationType.installed: + break; } if (result.statusInfo != null) @@ -238,7 +252,8 @@ abstract class Workflow { enum ValidationType { missing, partial, - installed + notAvailable, + installed, } abstract class DoctorValidator { @@ -286,6 +301,7 @@ class GroupedValidator extends DoctorValidator { mergedType = ValidationType.partial; } break; + case ValidationType.notAvailable: case ValidationType.partial: mergedType = ValidationType.partial; break; @@ -322,6 +338,7 @@ class ValidationResult { return '[✗]'; case ValidationType.installed: return '[✓]'; + case ValidationType.notAvailable: case ValidationType.partial: return '[!]'; } @@ -600,7 +617,7 @@ class IntelliJValidatorOnMac extends IntelliJValidator { } class DeviceValidator extends DoctorValidator { - DeviceValidator() : super('Connected devices'); + DeviceValidator() : super('Connected device'); @override Future validate() async { @@ -619,7 +636,7 @@ class DeviceValidator extends DoctorValidator { } if (devices.isEmpty) { - return ValidationResult(ValidationType.partial, messages); + return ValidationResult(ValidationType.notAvailable, messages); } else { return ValidationResult(ValidationType.installed, messages, statusInfo: '${devices.length} available'); } diff --git a/packages/flutter_tools/test/commands/doctor_test.dart b/packages/flutter_tools/test/commands/doctor_test.dart index 7b5dcc71ee7..7e3746369d1 100644 --- a/packages/flutter_tools/test/commands/doctor_test.dart +++ b/packages/flutter_tools/test/commands/doctor_test.dart @@ -148,13 +148,16 @@ void main() { '[✗] Missing Validator\n' ' ✗ A useful error message\n' ' ! A hint message\n' + '[!] Not Available Validator\n' + ' ✗ A useful error message\n' + ' ! A hint message\n' '[!] Partial Validator with only a Hint\n' ' ! There is a hint here\n' '[!] Partial Validator with Errors\n' ' ✗ A error message indicating partial installation\n' ' ! Maybe a hint will help the user\n' '\n' - '! Doctor found issues in 3 categories.\n' + '! Doctor found issues in 4 categories.\n' )); }); @@ -170,6 +173,11 @@ void main() { ' • A message that is not an error\n' ' ! A hint message\n' '\n' + '[!] Not Available Validator\n' + ' ✗ A useful error message\n' + ' • A message that is not an error\n' + ' ! A hint message\n' + '\n' '[!] Partial Validator with only a Hint\n' ' ! There is a hint here\n' ' • But there is no error\n' @@ -179,7 +187,7 @@ void main() { ' ! Maybe a hint will help the user\n' ' • An extra message with some verbose details\n' '\n' - '! Doctor found issues in 3 categories.\n' + '! Doctor found issues in 4 categories.\n' )); }); }); @@ -301,6 +309,19 @@ class MissingValidator extends DoctorValidator { } } +class NotAvailableValidator extends DoctorValidator { + NotAvailableValidator(): super('Not Available Validator'); + + @override + Future validate() async { + final List messages = []; + messages.add(ValidationMessage.error('A useful error message')); + messages.add(ValidationMessage('A message that is not an error')); + messages.add(ValidationMessage.hint('A hint message')); + return ValidationResult(ValidationType.notAvailable, messages); + } +} + class PartialValidatorWithErrors extends DoctorValidator { PartialValidatorWithErrors() : super('Partial Validator with Errors'); @@ -336,6 +357,7 @@ class FakeDoctor extends Doctor { _validators = []; _validators.add(PassingValidator('Passing Validator')); _validators.add(MissingValidator()); + _validators.add(NotAvailableValidator()); _validators.add(PartialValidatorWithHintsOnly()); _validators.add(PartialValidatorWithErrors()); }