blob: 83e4ad2142b4dee1a5505e950f30acbbe4569e94 [file]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. 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:async';
import 'package:analysis_server/src/status/diagnostics.dart';
import 'package:analysis_server/src/status/pages.dart';
import 'package:analyzer/src/generated/engine.dart';
/// The page that displays information about analysis options.
class AnalysisOptionsPage extends DiagnosticPageWithNav {
AnalysisOptionsPage(DiagnosticsSite site)
: super(
site,
'options',
'Analysis options',
description: 'Analysis options file contents.',
);
@override
Future<void> generateContent(Map<String, String> params) async {
if (driverMap.isEmpty) {
blankslate('No contexts.');
return;
}
var (folder: folder, driver: driver) = currentContext(params);
var contextPath = folder.path;
writeContextNavigationTabs(folder);
buf.writeln(formatOption('Context location', escape(contextPath)));
var optionsList = getOptionsList(folder, driver);
p(
'This analysis context is configured with ${optionsList.length} analysis '
'options files:',
);
for (var options in optionsList) {
h3(options.file!.path);
_writeMap(options.toDebugInfo());
}
}
void _writeList(Iterable<Object> info) {
var filtered = info.where((item) {
if (item is Map && item.isEmpty) return false;
if (item is Iterable && item.isEmpty) return false;
return true;
});
if (filtered.isEmpty) return;
ul(filtered, _writeValue);
}
void _writeMap(Map<String, Object> info) {
if (info.isEmpty) return;
buf.writeln('<table>');
for (var MapEntry(:key, :value) in info.entries) {
if (value is Map && value.isEmpty) continue;
if (value is Iterable && value.isEmpty) continue;
buf.writeln('<tr>');
buf.write('<td>${escape(key)}</td>');
buf.write('<td>');
_writeValue(value);
buf.writeln('</td>');
buf.writeln('</tr>');
}
buf.writeln('</table>');
}
void _writeValue(Object item) {
switch (item) {
case Map<String, Object>():
_writeMap(item);
case Iterable<Object>():
_writeList(item);
case DebugLink(:var url, :var text):
buf.write(url == null ? escape(text) : '<a href="$url">$text</a>');
case DebugCodeBlock(:var text):
pre(() => buf.write(escape(text)));
default:
buf.write(escape(item.toString()));
}
}
}