diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart index 6709f42b08..1117a8b05c 100644 --- a/packages/flutter_tools/lib/src/vscode/vscode.dart +++ b/packages/flutter_tools/lib/src/vscode/vscode.dart @@ -224,8 +224,12 @@ class VsCode { return null; } final String jsonString = fs.file(packageJsonPath).readAsStringSync(); - final Map jsonObject = castStringKeyedMap(json.decode(jsonString)); - return jsonObject['version'] as String; + try { + final Map jsonObject = castStringKeyedMap(json.decode(jsonString)); + return jsonObject['version'] as String; + } on FormatException { + return null; + } } } diff --git a/packages/flutter_tools/test/general.shard/vscode_test.dart b/packages/flutter_tools/test/general.shard/vscode_test.dart new file mode 100644 index 0000000000..b23bb06fe4 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/vscode_test.dart @@ -0,0 +1,28 @@ +// Copyright 2019 The Chromium Authors. 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:file/file.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/version.dart'; +import 'package:flutter_tools/src/vscode/vscode.dart'; + +import '../src/common.dart'; +import '../src/context.dart'; + +void main() { + testUsingContext('VsCode.fromDirectory does not crash when packages.json is malformed', () { + // Create invalid JSON file. + fs.file(fs.path.join('', 'resources', 'app', 'package.json')) + ..createSync(recursive: true) + ..writeAsStringSync('{'); + + final VsCode vsCode = VsCode.fromDirectory('', ''); + + expect(vsCode.version, Version.unknown); + }, overrides: { + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager.any(), + }); +}