Skip to content

Commit aa0e081

Browse files
srawlinsCommit Queue
authored andcommitted
DAS: Correct startsWith use in context pages
Perhaps fixes #61393 I extracted this logic that determines what AnalysisDriver and what Folder are being examined, as it's a little tricky, and it was in a _really_ long method. Change-Id: I96698ccbb55ab3b3337eee5142d86470417919b4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/446540 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 5c3b11c commit aa0e081

File tree

1 file changed

+42
-26
lines changed

1 file changed

+42
-26
lines changed

pkg/analysis_server/lib/src/status/pages/contexts_page.dart

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:async';
6+
import 'dart:collection';
67
import 'dart:math' as math;
78

89
import 'package:analysis_server/src/status/diagnostics.dart';
910
import 'package:analysis_server/src/status/pages.dart';
1011
import 'package:analysis_server/src/status/utilities/library_cycle_extensions.dart';
1112
import 'package:analysis_server/src/status/utilities/string_extensions.dart';
13+
import 'package:analyzer/file_system/file_system.dart';
1214
import 'package:analyzer/src/context/source.dart';
1315
import 'package:analyzer/src/dart/analysis/analysis_options_map.dart';
16+
import 'package:analyzer/src/dart/analysis/driver.dart' as analysis;
1417
import 'package:analyzer/src/dart/analysis/file_state.dart';
1518
import 'package:analyzer/src/dart/analysis/library_graph.dart';
1619
import 'package:analyzer/src/dart/sdk/sdk.dart';
@@ -19,7 +22,6 @@ import 'package:analyzer/src/source/package_map_resolver.dart';
1922
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
2023
import 'package:analyzer/src/workspace/pub.dart';
2124
import 'package:analyzer/src/workspace/workspace.dart';
22-
import 'package:collection/collection.dart';
2325
import 'package:path/path.dart' as path;
2426

2527
class ContextsPage extends DiagnosticPageWithNav {
@@ -38,31 +40,21 @@ class ContextsPage extends DiagnosticPageWithNav {
3840

3941
@override
4042
Future<void> generateContent(Map<String, String> params) async {
41-
var driverMap = server.driverMap;
43+
var driverMap = SplayTreeMap.of(
44+
server.driverMap,
45+
(a, b) => a.shortName.compareTo(b.shortName),
46+
);
4247
if (driverMap.isEmpty) {
4348
blankslate('No contexts.');
4449
return;
4550
}
4651

47-
var contextPath = params['context'];
48-
var entries = driverMap.entries.toList();
49-
entries.sort(
50-
(first, second) => first.key.shortName.compareTo(second.key.shortName),
51-
);
52-
var entry = entries.firstWhereOrNull((f) => f.key.path == contextPath);
53-
54-
if (entry == null) {
55-
entry = entries.first;
56-
contextPath = entry.key.path;
57-
}
58-
59-
var folder = entry.key;
60-
var driver = entry.value;
52+
var (folder: folder, driver: driver) = _currentContext(params, driverMap);
53+
var contextPath = folder.path;
6154

6255
buf.writeln('<div class="tabnav">');
6356
buf.writeln('<nav class="tabnav-tabs">');
64-
for (var entry in entries) {
65-
var f = entry.key;
57+
for (var f in driverMap.keys) {
6658
if (f == folder) {
6759
buf.writeln(
6860
'<a class="tabnav-tab selected">${escape(f.shortName)}</a>',
@@ -85,8 +77,11 @@ class ContextsPage extends DiagnosticPageWithNav {
8577
h3('Analysis options');
8678

8779
// Display analysis options entries inside this context root.
80+
var separator = folder.provider.pathContext.separator;
8881
var optionsInContextRoot = driver.analysisOptionsMap.entries.where(
89-
(OptionsMapEntry entry) => contextPath!.startsWith(entry.folder.path),
82+
(e) =>
83+
contextPath == e.folder.path ||
84+
contextPath.startsWith('${e.folder.path}$separator'),
9085
);
9186
ul(optionsInContextRoot, (OptionsMapEntry entry) {
9287
var folder = entry.folder;
@@ -97,15 +92,11 @@ class ContextsPage extends DiagnosticPageWithNav {
9792
buf.writeln(' <a href="$contentsPath">analysis_options.yaml</a>');
9893
}, classes: 'scroll-table');
9994

100-
String lenCounter(int length) {
101-
return '<span class="counter" style="float: right;">$length</span>';
102-
}
103-
10495
h3('Workspace');
105-
var workspace = driver.analysisContext?.contextRoot.workspace;
96+
var workspace = driver.analysisContext!.contextRoot.workspace;
10697
buf.writeln('<p>');
107-
buf.writeln(writeOption('Workspace root', escape(workspace?.root)));
108-
var workspaceFolder = folder.provider.getFolder(workspace!.root);
98+
buf.writeln(writeOption('Workspace root', escape(workspace.root)));
99+
var workspaceFolder = folder.provider.getFolder(workspace.root);
109100

110101
void writePackage(WorkspacePackageImpl package) {
111102
buf.writeln(writeOption('Package root', escape(package.root.path)));
@@ -127,6 +118,11 @@ class ContextsPage extends DiagnosticPageWithNav {
127118
buf.writeln(
128119
writeOption('Has package_config.json file', packageConfig.exists),
129120
);
121+
122+
String lenCounter(int length) {
123+
return '<span class="counter" style="float: right;">$length</span>';
124+
}
125+
130126
if (workspace is PackageConfigWorkspace) {
131127
var packages = workspace.allPackages;
132128
h4('Packages ${lenCounter(packages.length)}', raw: true);
@@ -269,4 +265,24 @@ class ContextsPage extends DiagnosticPageWithNav {
269265
}
270266
buf.write('<br>}');
271267
}
268+
269+
/// Information regarding the context currently being displayed.
270+
({Folder folder, analysis.AnalysisDriver driver}) _currentContext(
271+
Map<String, String> params,
272+
Map<Folder, analysis.AnalysisDriver> driverMap,
273+
) {
274+
var contextPath = params['context'];
275+
if (contextPath == null) {
276+
return (
277+
folder: driverMap.entries.first.key,
278+
driver: driverMap.entries.first.value,
279+
);
280+
} else {
281+
var entry = driverMap.entries.firstWhere(
282+
(e) => e.key.path == contextPath,
283+
orElse: () => driverMap.entries.first,
284+
);
285+
return (folder: entry.key, driver: entry.value);
286+
}
287+
}
272288
}

0 commit comments

Comments
 (0)