Make doctor output consistent between VS Code/IntelliJ/Android Studio when plugins are missing (#25269)

* Update VS Code validator to match Android Studio

- Now shows a tick (instead of partial) if installed
- Now shows a cross (instead of dot) if extension is not installed

Fixes #22931.
This commit is contained in:
Danny Tuppeny 2018-12-12 17:36:42 +00:00 committed by GitHub
parent 9150b3f031
commit e29b023a6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 24 deletions

View file

@ -44,7 +44,7 @@ class AndroidStudioValidator extends DoctorValidator {
plugins.validatePackage(messages, <String>['Dart'], 'Dart');
if (_studio.isValid) {
type = ValidationType.installed;
type = _hasIssues(messages) ? ValidationType.partial : ValidationType.installed;
messages.addAll(_studio.validationMessages
.map<ValidationMessage>((String m) => ValidationMessage(m)));
} else {
@ -61,6 +61,10 @@ class AndroidStudioValidator extends DoctorValidator {
return ValidationResult(type, messages, statusInfo: studioVersionText);
}
bool _hasIssues(List<ValidationMessage> messages) {
return messages.any((ValidationMessage message) => message.isError);
}
}
class NoAndroidStudioValidator extends DoctorValidator {

View file

@ -8,22 +8,33 @@ import '../base/common.dart';
import '../base/file_system.dart';
import '../base/platform.dart';
import '../base/version.dart';
import '../doctor.dart';
// Include VS Code insiders (useful for debugging).
const bool _includeInsiders = false;
const String extensionIdentifier = 'Dart-Code.flutter';
const String extensionMarketplaceUrl =
'https://marketplace.visualstudio.com/items?itemName=$extensionIdentifier';
class VsCode {
VsCode._(this.directory, this.extensionDirectory, { Version version, this.edition })
: version = version ?? Version.unknown {
if (!fs.isDirectorySync(directory)) {
_validationMessages.add('VS Code not found at $directory');
_validationMessages.add(ValidationMessage.error('VS Code not found at $directory'));
return;
} else {
_validationMessages.add(ValidationMessage('VS Code at $directory'));
}
// If the extensions directory doesn't exist at all, the listSync()
// below will fail, so just bail out early.
final ValidationMessage notInstalledMessage = ValidationMessage.error(
'Flutter extension not installed; install from\n$extensionMarketplaceUrl');
if (!fs.isDirectorySync(extensionDirectory)) {
_validationMessages.add(notInstalledMessage);
return;
}
@ -41,7 +52,9 @@ class VsCode {
_isValid = true;
_extensionVersion = Version.parse(
extensionDir.basename.substring('$extensionIdentifier-'.length));
_validationMessages.add('Flutter extension version $_extensionVersion');
_validationMessages.add(ValidationMessage('Flutter extension version $_extensionVersion'));
} else {
_validationMessages.add(notInstalledMessage);
}
}
@ -61,16 +74,14 @@ class VsCode {
final Version version;
final String edition;
static const String extensionIdentifier = 'Dart-Code.flutter';
bool _isValid = false;
Version _extensionVersion;
final List<String> _validationMessages = <String>[];
final List<ValidationMessage> _validationMessages = <ValidationMessage>[];
bool get isValid => _isValid;
String get productName => 'VS Code' + (edition != null ? ', $edition' : '');
Iterable<String> get validationMessages => _validationMessages;
Iterable<ValidationMessage> get validationMessages => _validationMessages;
static List<VsCode> allInstalled() {
if (platform.isMacOS)

View file

@ -13,8 +13,6 @@ class VsCodeValidator extends DoctorValidator {
final VsCode _vsCode;
static const String extensionMarketplaceUrl =
'https://marketplace.visualstudio.com/items?itemName=${VsCode.extensionIdentifier}';
static Iterable<DoctorValidator> get installedValidators {
return VsCode
@ -24,24 +22,18 @@ class VsCodeValidator extends DoctorValidator {
@override
Future<ValidationResult> validate() async {
final List<ValidationMessage> messages = <ValidationMessage>[];
ValidationType type = ValidationType.missing;
final String vsCodeVersionText = _vsCode.version == Version.unknown
? null
: 'version ${_vsCode.version}';
messages.add(ValidationMessage('VS Code at ${_vsCode.directory}'));
if (_vsCode.isValid) {
type = ValidationType.installed;
messages.addAll(_vsCode.validationMessages
.map<ValidationMessage>((String m) => ValidationMessage(m)));
} else {
type = ValidationType.partial;
messages.addAll(_vsCode.validationMessages
.map<ValidationMessage>((String m) => ValidationMessage.error(m)));
messages.add(ValidationMessage(
'Flutter extension not installed; install from\n$extensionMarketplaceUrl'));
}
return ValidationResult(type, messages, statusInfo: vsCodeVersionText);
final ValidationType validationType = _vsCode.isValid
? ValidationType.installed
: ValidationType.partial;
return ValidationResult(
validationType,
_vsCode.validationMessages,
statusInfo: vsCodeVersionText,
);
}
}

View file

@ -55,6 +55,7 @@ void main() {
message = result.messages
.firstWhere((ValidationMessage m) => m.message.startsWith('Flutter '));
expect(message.message, 'Flutter extension version 4.5.6');
expect(message.isError, isFalse);
}, overrides: noColorTerminalOverride);
testUsingContext('vs code validator when 64bit installed', () async {
@ -86,6 +87,7 @@ void main() {
message = result.messages
.firstWhere((ValidationMessage m) => m.message.startsWith('Flutter '));
expect(message.message, startsWith('Flutter extension not installed'));
expect(message.isError, isTrue);
}, overrides: noColorTerminalOverride);
});