33// BSD-style license that can be found in the LICENSE file.
44
55import 'dart:async' ;
6+ import 'dart:collection' ;
67import 'dart:math' as math;
78
89import 'package:analysis_server/src/status/diagnostics.dart' ;
910import 'package:analysis_server/src/status/pages.dart' ;
1011import 'package:analysis_server/src/status/utilities/library_cycle_extensions.dart' ;
1112import 'package:analysis_server/src/status/utilities/string_extensions.dart' ;
13+ import 'package:analyzer/file_system/file_system.dart' ;
1214import 'package:analyzer/src/context/source.dart' ;
1315import 'package:analyzer/src/dart/analysis/analysis_options_map.dart' ;
16+ import 'package:analyzer/src/dart/analysis/driver.dart' as analysis;
1417import 'package:analyzer/src/dart/analysis/file_state.dart' ;
1518import 'package:analyzer/src/dart/analysis/library_graph.dart' ;
1619import 'package:analyzer/src/dart/sdk/sdk.dart' ;
@@ -19,7 +22,6 @@ import 'package:analyzer/src/source/package_map_resolver.dart';
1922import 'package:analyzer/src/util/file_paths.dart' as file_paths;
2023import 'package:analyzer/src/workspace/pub.dart' ;
2124import 'package:analyzer/src/workspace/workspace.dart' ;
22- import 'package:collection/collection.dart' ;
2325import 'package:path/path.dart' as path;
2426
2527class 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