Index: pkg/analysis_server/lib/src/status/tree_writer.dart |
diff --git a/pkg/analysis_server/lib/src/status/tree_writer.dart b/pkg/analysis_server/lib/src/status/tree_writer.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..80f565f7029e7bd0b53cc373765f75ecd50a0e89 |
--- /dev/null |
+++ b/pkg/analysis_server/lib/src/status/tree_writer.dart |
@@ -0,0 +1,136 @@ |
+// 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. |
+ |
+library analysis_server.src.status.ast_writer; |
+ |
+import 'dart:convert'; |
+ |
+import 'package:analysis_server/src/get_handler.dart'; |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:analyzer/src/generated/java_engine.dart'; |
+import 'package:analyzer/src/generated/source.dart'; |
+import 'package:analyzer/src/generated/constant.dart'; |
+ |
+/** |
+ * Utility methods that can be mixed in to classes that produce an HTML |
+ * representation of a tree structure. |
+ */ |
+abstract class TreeWriter { |
+ /** |
+ * The buffer on which the HTML is to be written. |
+ */ |
+ StringBuffer buffer; |
+ |
+ /** |
+ * 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>[]; |
+ |
+ void indent([int extra = 0]) { |
+ for (int i = 0; i < indentLevel; i++) { |
+ buffer.write('┊ '); |
+ } |
+ if (extra > 0) { |
+ buffer.write('┊ '); |
+ for (int i = 1; i < extra; i++) { |
+ buffer.write(' '); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Write a representation of the given [properties] to the buffer. |
+ */ |
+ void writeProperties(Map<String, Object> properties) { |
+ List<String> propertyNames = properties.keys.toList(); |
+ propertyNames.sort(); |
+ for (String 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>'); |
+ } |
+ } |
+ |
+ /** |
+ * Write the [value] of the property with the given [name]. |
+ */ |
+ void _writePropertyValue(Object value, int baseIndent) { |
+ if (value is List) { |
+ if (value.isEmpty) { |
+ buffer.write('[]'); |
+ } else { |
+ int elementIndent = baseIndent + 2; |
+ buffer.write('[<br>'); |
+ for (Object element in value) { |
+ indent(elementIndent); |
+ _writePropertyValue(element, elementIndent); |
+ buffer.write('<br>'); |
+ } |
+ indent(baseIndent); |
+ buffer.write(']'); |
+ } |
+ } else { |
+ String valueString = _toString(value); |
+ if (valueString == null) { |
+ buffer.write('<span style="color: #FF0000">'); |
+ buffer.write(HTML_ESCAPE.convert(value.runtimeType.toString())); |
+ buffer.write('</span>'); |
+ } else { |
+ buffer.write(HTML_ESCAPE.convert(valueString)); |
+ if (value is Element && value is! LibraryElement) { |
+ String name = value.name; |
+ if (name != null) { |
+ buffer.write(' ['); |
+ buffer.write(GetHandler.makeLink(GetHandler.INDEX_ELEMENT_BY_NAME, { |
+ 'name': name |
+ }, 'search index')); |
+ buffer.write(']'); |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
+ String _toString(Object value) { |
+ try { |
+ if (value is Source) { |
+ return 'Source (uri="${value.uri}", path="${value.fullName}")'; |
+ } else if (value is ElementAnnotationImpl) { |
+ StringBuffer buffer = new StringBuffer(); |
+ buffer.write(_toString(value.element)); |
+ EvaluationResultImpl 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(new CaughtException(exception, stackTrace)); |
+ } |
+ return null; |
+ } |
+} |