From e29b023a6bbbd6b106aaf8802db3192ff3d3cf9c Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 12 Dec 2018 17:36:42 +0000 Subject: [PATCH] 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. --- .../src/android/android_studio_validator.dart | 6 ++++- .../flutter_tools/lib/src/vscode/vscode.dart | 23 +++++++++++----- .../lib/src/vscode/vscode_validator.dart | 26 +++++++------------ .../test/commands/doctor_test.dart | 2 ++ 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/android_studio_validator.dart b/packages/flutter_tools/lib/src/android/android_studio_validator.dart index bf12cfb3770..268926a791d 100644 --- a/packages/flutter_tools/lib/src/android/android_studio_validator.dart +++ b/packages/flutter_tools/lib/src/android/android_studio_validator.dart @@ -44,7 +44,7 @@ class AndroidStudioValidator extends DoctorValidator { plugins.validatePackage(messages, ['Dart'], 'Dart'); if (_studio.isValid) { - type = ValidationType.installed; + type = _hasIssues(messages) ? ValidationType.partial : ValidationType.installed; messages.addAll(_studio.validationMessages .map((String m) => ValidationMessage(m))); } else { @@ -61,6 +61,10 @@ class AndroidStudioValidator extends DoctorValidator { return ValidationResult(type, messages, statusInfo: studioVersionText); } + + bool _hasIssues(List messages) { + return messages.any((ValidationMessage message) => message.isError); + } } class NoAndroidStudioValidator extends DoctorValidator { diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart index 5fb446cbcc7..00dda292803 100644 --- a/packages/flutter_tools/lib/src/vscode/vscode.dart +++ b/packages/flutter_tools/lib/src/vscode/vscode.dart @@ -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 _validationMessages = []; + final List _validationMessages = []; bool get isValid => _isValid; String get productName => 'VS Code' + (edition != null ? ', $edition' : ''); - Iterable get validationMessages => _validationMessages; + Iterable get validationMessages => _validationMessages; static List allInstalled() { if (platform.isMacOS) diff --git a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart index 3d95170a008..8746ae16d16 100644 --- a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart +++ b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart @@ -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 get installedValidators { return VsCode @@ -24,24 +22,18 @@ class VsCodeValidator extends DoctorValidator { @override Future validate() async { - final List messages = []; - 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((String m) => ValidationMessage(m))); - } else { - type = ValidationType.partial; - messages.addAll(_vsCode.validationMessages - .map((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, + ); } } diff --git a/packages/flutter_tools/test/commands/doctor_test.dart b/packages/flutter_tools/test/commands/doctor_test.dart index 6f5e2484866..c3321d151b8 100644 --- a/packages/flutter_tools/test/commands/doctor_test.dart +++ b/packages/flutter_tools/test/commands/doctor_test.dart @@ -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); });