Skip to content

Commit

Permalink
Make doctor output consistent between VS Code/IntelliJ/Android Studio…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
DanTup committed Dec 12, 2018
1 parent 9150b3f commit e29b023
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 25 deletions.
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
23 changes: 17 additions & 6 deletions packages/flutter_tools/lib/src/vscode/vscode.dart
Expand Up @@ -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;
}

Expand All @@ -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);
}
}

Expand All @@ -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)
Expand Down
28 changes: 10 additions & 18 deletions packages/flutter_tools/lib/src/vscode/vscode_validator.dart
Expand Up @@ -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
Expand All @@ -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,
);
}
}
2 changes: 2 additions & 0 deletions packages/flutter_tools/test/commands/doctor_test.dart
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
});

Expand Down

0 comments on commit e29b023

Please sign in to comment.