blob: 01543e1eb4cd6dee849120ff8141307333bb974a [file] [log] [blame]
// Copyright (c) 2015, 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:convert';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/generated/source.dart';
/// Utility methods that can be mixed in to classes that produce an HTML
/// representation of a tree structure.
mixin TreeWriter {
/// The current level of indentation.
int indentLevel = 0;
/// A list containing the exceptions that were caught while attempting to
/// write out the tree structure.
List<CaughtException> exceptions = <CaughtException>[];
/// The buffer on which the HTML is to be written.
StringBuffer get buffer;
void indent([int extra = 0]) {
for (var i = 0; i < indentLevel; i++) {
buffer.write('&#x250A;&nbsp;&nbsp;&nbsp;');
}
if (extra > 0) {
buffer.write('&#x250A;&nbsp;&nbsp;&nbsp;');
for (var i = 1; i < extra; i++) {
buffer.write('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
}
}
}
/// Write a representation of the given [properties] to the buffer.
void writeProperties(Map<String, Object?> properties) {
var propertyNames = properties.keys.toList();
propertyNames.sort();
for (var propertyName in propertyNames) {
writeProperty(propertyName, properties[propertyName]);
}
}
/// Write the [value] of the property with the given [name].
void writeProperty(String name, Object? value) {
if (value != null) {
indent(2);
buffer.write('$name = ');
_writePropertyValue(value, indentLevel);
buffer.write('<br>');
}
}
String? _toString(Object? value) {
try {
if (value is Source) {
return 'Source (uri="${value.uri}", path="${value.fullName}")';
} else if (value is ElementAnnotationImpl) {
var buffer = StringBuffer();
buffer.write(_toString(value.element));
var result = value.evaluationResult;
if (result == null) {
buffer.write(': no result');
} else {
buffer.write(': value = ');
buffer.write(result.value);
buffer.write('; errors = ');
buffer.write(result.errors);
}
return buffer.toString();
} else {
return value.toString();
}
} catch (exception, stackTrace) {
exceptions.add(CaughtException(exception, stackTrace));
}
return null;
}
/// Write the [value] of the property with the given [name].
void _writePropertyValue(Object value, int baseIndent) {
if (value is List<Object>) {
if (value.isEmpty) {
buffer.write('[]');
} else {
var elementIndent = baseIndent + 2;
buffer.write('[<br>');
for (var element in value) {
indent(elementIndent);
_writePropertyValue(element, elementIndent);
buffer.write('<br>');
}
indent(baseIndent);
buffer.write(']');
}
} else {
var valueString = _toString(value);
if (valueString == null) {
buffer.write('<span style="color: #FF0000">');
buffer.write(htmlEscape.convert(value.runtimeType.toString()));
buffer.write('</span>');
} else {
buffer.write(htmlEscape.convert(valueString));
}
}
}
}