forked from sony/flutter-elinux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vscode_helper.dart
79 lines (70 loc) · 2.68 KB
/
vscode_helper.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'package:file/file.dart';
import 'package:flutter_tools/src/convert.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project.dart';
const String kConfigNameAttach = 'flutter-elinux: Attach';
String _processJson(String jsonString) {
// The extended JSON format used by launch.json files allows comments and
// trailing commas. Remove them to prevent decoding errors.
final RegExp comments =
RegExp(r'(?<![:"/])(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|//.*\n?)');
final RegExp trailingCommas = RegExp(r',(?=\s*?[\}\]])');
return jsonString
.replaceAll(comments, '')
.replaceAll(trailingCommas, '')
.trim();
}
void updateLaunchJsonFile(FlutterProject project, Uri vmServiceUri) {
if (project.directory.basename == 'example') {
final FlutterProject parentProject =
FlutterProject.fromDirectory(project.directory.parent);
if (parentProject.pubspecFile.existsSync()) {
updateLaunchJsonFile(parentProject, vmServiceUri);
}
}
final File launchJsonFile =
project.directory.childDirectory('.vscode').childFile('launch.json');
String jsonString = '';
if (launchJsonFile.existsSync()) {
jsonString = _processJson(launchJsonFile.readAsStringSync());
}
Map<Object?, Object?> decoded = <Object?, Object?>{};
if (jsonString.isNotEmpty) {
try {
decoded = jsonDecode(jsonString) as Map<Object?, Object?>;
} on FormatException catch (error) {
globals.printError('Failed to parse ${launchJsonFile.path}:\n$error');
return;
}
}
decoded['version'] ??= '0.2.0';
decoded['configurations'] ??= <Object?>[];
final List<Object?> configs = decoded['configurations']! as List<Object?>;
if (!configs.any((Object? config) =>
config is Map && config['name'] == kConfigNameAttach)) {
configs.add(<String, String>{
'name': kConfigNameAttach,
'request': 'attach',
'type': 'dart',
'deviceId': 'flutter-tester',
});
}
for (final Object? config in configs) {
if (config is! Map || config['name'] != kConfigNameAttach) {
continue;
}
config['cwd'] = project.hasExampleApp
? r'${workspaceFolder}/example'
: r'${workspaceFolder}';
config['vmServiceUri'] = vmServiceUri.toString();
}
const JsonEncoder encoder = JsonEncoder.withIndent(' ');
launchJsonFile
..createSync(recursive: true)
..writeAsStringSync(encoder.convert(decoded));
}