Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analysis_server.src.status.get_handler; | 5 library analysis_server.src.status.get_handler; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 import 'dart:convert'; | 9 import 'dart:convert'; |
| 10 import 'dart:io'; | 10 import 'dart:io'; |
| 11 import 'dart:math'; | 11 import 'dart:math'; |
| 12 | 12 |
| 13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; | 13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; |
| 14 import 'package:analysis_server/src/analysis_server.dart'; | 14 import 'package:analysis_server/src/analysis_server.dart'; |
| 15 import 'package:analysis_server/src/domain_completion.dart'; | 15 import 'package:analysis_server/src/domain_completion.dart'; |
| 16 import 'package:analysis_server/src/domain_diagnostic.dart'; | 16 import 'package:analysis_server/src/domain_diagnostic.dart'; |
| 17 import 'package:analysis_server/src/domain_execution.dart'; | 17 import 'package:analysis_server/src/domain_execution.dart'; |
| 18 import 'package:analysis_server/src/operation/operation.dart'; | 18 import 'package:analysis_server/src/operation/operation.dart'; |
| 19 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 19 import 'package:analysis_server/src/operation/operation_analysis.dart'; |
| 20 import 'package:analysis_server/src/operation/operation_queue.dart'; | 20 import 'package:analysis_server/src/operation/operation_queue.dart'; |
| 21 import 'package:analysis_server/src/services/index/index.dart'; | 21 import 'package:analysis_server/src/services/index/index.dart'; |
| 22 import 'package:analysis_server/src/services/index/local_index.dart'; | 22 import 'package:analysis_server/src/services/index/local_index.dart'; |
| 23 import 'package:analysis_server/src/services/index/store/split_store.dart'; | 23 import 'package:analysis_server/src/services/index/store/split_store.dart'; |
| 24 import 'package:analysis_server/src/socket_server.dart'; | 24 import 'package:analysis_server/src/socket_server.dart'; |
| 25 import 'package:analysis_server/src/status/ast_writer.dart'; | 25 import 'package:analysis_server/src/status/ast_writer.dart'; |
| 26 import 'package:analysis_server/src/status/element_writer.dart'; | 26 import 'package:analysis_server/src/status/element_writer.dart'; |
| 27 import 'package:analysis_server/src/status/validator.dart'; | 27 import 'package:analysis_server/src/status/validator.dart'; |
| 28 import 'package:analysis_server/src/utilities/average.dart'; | 28 import 'package:analysis_server/src/utilities/average.dart'; |
| 29 import 'package:analyzer/dart/element/element.dart'; | 29 import 'package:analyzer/dart/element/element.dart'; |
| 30 import 'package:analyzer/dart/element/visitor.dart'; | |
| 30 import 'package:analyzer/file_system/file_system.dart'; | 31 import 'package:analyzer/file_system/file_system.dart'; |
| 31 import 'package:analyzer/source/error_processor.dart'; | 32 import 'package:analyzer/source/error_processor.dart'; |
| 32 import 'package:analyzer/src/context/cache.dart'; | 33 import 'package:analyzer/src/context/cache.dart'; |
| 33 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; | 34 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; |
| 34 import 'package:analyzer/src/generated/ast.dart'; | 35 import 'package:analyzer/src/generated/ast.dart'; |
| 35 import 'package:analyzer/src/generated/engine.dart'; | 36 import 'package:analyzer/src/generated/engine.dart'; |
| 36 import 'package:analyzer/src/generated/error.dart'; | 37 import 'package:analyzer/src/generated/error.dart'; |
| 37 import 'package:analyzer/src/generated/java_engine.dart'; | 38 import 'package:analyzer/src/generated/java_engine.dart'; |
| 38 import 'package:analyzer/src/generated/resolver.dart'; | 39 import 'package:analyzer/src/generated/resolver.dart'; |
| 39 import 'package:analyzer/src/generated/source.dart'; | 40 import 'package:analyzer/src/generated/source.dart'; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 50 import 'package:analyzer/task/model.dart'; | 51 import 'package:analyzer/task/model.dart'; |
| 51 import 'package:plugin/plugin.dart'; | 52 import 'package:plugin/plugin.dart'; |
| 52 | 53 |
| 53 /** | 54 /** |
| 54 * A function that can be used to generate HTML output into the given [buffer]. | 55 * A function that can be used to generate HTML output into the given [buffer]. |
| 55 * The HTML that is generated must be valid (special characters must already be | 56 * The HTML that is generated must be valid (special characters must already be |
| 56 * encoded). | 57 * encoded). |
| 57 */ | 58 */ |
| 58 typedef void HtmlGenerator(StringBuffer buffer); | 59 typedef void HtmlGenerator(StringBuffer buffer); |
| 59 | 60 |
| 61 class ElementCounter extends RecursiveElementVisitor { | |
| 62 Map<Type, int> counts = new HashMap<Type, int>(); | |
| 63 int elementsWithDocs = 0; | |
| 64 int totalDocSpan = 0; | |
| 65 | |
| 66 void visit(Element element) { | |
| 67 SourceRange docRange = element.docRange; | |
|
Brian Wilkerson
2015/12/16 23:38:53
I think you're about to remove this API. :-)
pquitslund
2015/12/16 23:46:42
: ) Yep. When I do, I was thinking we may still w
| |
| 68 if (docRange != null) { | |
| 69 ++elementsWithDocs; | |
| 70 totalDocSpan += docRange.length; | |
| 71 } | |
| 72 | |
| 73 Type type = element.runtimeType; | |
| 74 if (counts[type] == null) { | |
| 75 counts[type] = 1; | |
| 76 } else { | |
| 77 counts[type]++; | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 @override | |
| 82 visitClassElement(ClassElement element) { | |
| 83 visit(element); | |
| 84 super.visitClassElement(element); | |
| 85 } | |
| 86 | |
| 87 @override | |
| 88 visitCompilationUnitElement(CompilationUnitElement element) { | |
| 89 visit(element); | |
| 90 super.visitCompilationUnitElement(element); | |
| 91 } | |
| 92 | |
| 93 @override | |
| 94 visitConstructorElement(ConstructorElement element) { | |
| 95 visit(element); | |
| 96 super.visitConstructorElement(element); | |
| 97 } | |
| 98 | |
| 99 @override | |
| 100 visitExportElement(ExportElement element) { | |
| 101 visit(element); | |
| 102 super.visitExportElement(element); | |
| 103 } | |
| 104 | |
| 105 @override | |
| 106 visitFieldElement(FieldElement element) { | |
| 107 visit(element); | |
| 108 super.visitFieldElement(element); | |
| 109 } | |
| 110 | |
| 111 @override | |
| 112 visitFieldFormalParameterElement(FieldFormalParameterElement element) { | |
| 113 visit(element); | |
| 114 super.visitFieldFormalParameterElement(element); | |
| 115 } | |
| 116 | |
| 117 @override | |
| 118 visitFunctionElement(FunctionElement element) { | |
| 119 visit(element); | |
| 120 super.visitFunctionElement(element); | |
| 121 } | |
| 122 | |
| 123 @override | |
| 124 visitFunctionTypeAliasElement(FunctionTypeAliasElement element) { | |
| 125 visit(element); | |
| 126 super.visitFunctionTypeAliasElement(element); | |
| 127 } | |
| 128 | |
| 129 @override | |
| 130 visitImportElement(ImportElement element) { | |
| 131 visit(element); | |
| 132 super.visitImportElement(element); | |
| 133 } | |
| 134 | |
| 135 @override | |
| 136 visitLabelElement(LabelElement element) { | |
| 137 visit(element); | |
| 138 super.visitLabelElement(element); | |
| 139 } | |
| 140 | |
| 141 @override | |
| 142 visitLibraryElement(LibraryElement element) { | |
| 143 visit(element); | |
| 144 super.visitLibraryElement(element); | |
| 145 } | |
| 146 | |
| 147 @override | |
| 148 visitLocalVariableElement(LocalVariableElement element) { | |
| 149 visit(element); | |
| 150 super.visitLocalVariableElement(element); | |
| 151 } | |
| 152 | |
| 153 @override | |
| 154 visitMethodElement(MethodElement element) { | |
| 155 visit(element); | |
| 156 super.visitMethodElement(element); | |
| 157 } | |
| 158 | |
| 159 @override | |
| 160 visitMultiplyDefinedElement(MultiplyDefinedElement element) { | |
| 161 visit(element); | |
| 162 super.visitMultiplyDefinedElement(element); | |
| 163 } | |
| 164 | |
| 165 @override | |
| 166 visitParameterElement(ParameterElement element) { | |
| 167 visit(element); | |
| 168 super.visitParameterElement(element); | |
| 169 } | |
| 170 | |
| 171 @override | |
| 172 visitPrefixElement(PrefixElement element) { | |
| 173 visit(element); | |
| 174 super.visitPrefixElement(element); | |
| 175 } | |
| 176 | |
| 177 @override | |
| 178 visitPropertyAccessorElement(PropertyAccessorElement element) { | |
| 179 visit(element); | |
| 180 super.visitPropertyAccessorElement(element); | |
| 181 } | |
| 182 | |
| 183 @override | |
| 184 visitTopLevelVariableElement(TopLevelVariableElement element) { | |
| 185 visit(element); | |
| 186 super.visitTopLevelVariableElement(element); | |
| 187 } | |
| 188 | |
| 189 @override | |
| 190 visitTypeParameterElement(TypeParameterElement element) { | |
| 191 visit(element); | |
| 192 super.visitTypeParameterElement(element); | |
| 193 } | |
| 194 } | |
| 195 | |
| 60 /** | 196 /** |
| 61 * Instances of the class [GetHandler] handle GET requests. | 197 * Instances of the class [GetHandler] handle GET requests. |
| 62 */ | 198 */ |
| 63 class GetHandler { | 199 class GetHandler { |
| 64 /** | 200 /** |
| 65 * The path used to request overall performance information. | 201 * The path used to request overall performance information. |
| 66 */ | 202 */ |
| 67 static const String ANALYSIS_PERFORMANCE_PATH = '/perf/analysis'; | 203 static const String ANALYSIS_PERFORMANCE_PATH = '/perf/analysis'; |
| 68 | 204 |
| 69 /** | 205 /** |
| (...skipping 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1686 buffer.write('<p>getDiagnostic (last call): '); | 1822 buffer.write('<p>getDiagnostic (last call): '); |
| 1687 buffer.write(elapsedMs); | 1823 buffer.write(elapsedMs); |
| 1688 buffer.write(' (ms)</p>'); | 1824 buffer.write(' (ms)</p>'); |
| 1689 buffer.write('<p>getDiagnostic (rolling average): '); | 1825 buffer.write('<p>getDiagnostic (rolling average): '); |
| 1690 buffer.write(_diagnosticCallAverage.value); | 1826 buffer.write(_diagnosticCallAverage.value); |
| 1691 buffer.write(' (ms)</p> '); | 1827 buffer.write(' (ms)</p> '); |
| 1692 | 1828 |
| 1693 var json = response.toJson()[Response.RESULT]; | 1829 var json = response.toJson()[Response.RESULT]; |
| 1694 List contexts = json['contexts']; | 1830 List contexts = json['contexts']; |
| 1695 contexts.sort((first, second) => first['name'].compareTo(second['name'])); | 1831 contexts.sort((first, second) => first['name'].compareTo(second['name'])); |
| 1832 | |
| 1833 // Track visited libraries. | |
| 1834 Set<LibraryElement> libraries = new HashSet<LibraryElement>(); | |
| 1835 | |
| 1836 // Count SDK elements separately. | |
| 1837 ElementCounter sdkCounter = new ElementCounter(); | |
| 1838 | |
| 1696 for (var context in contexts) { | 1839 for (var context in contexts) { |
| 1697 buffer.write('<p><h3>'); | 1840 buffer.write('<p><h3>'); |
| 1698 buffer.write(context['name']); | 1841 buffer.write(context['name']); |
| 1699 buffer.write('</h3></p>'); | 1842 buffer.write('</h3></p>'); |
| 1700 buffer.write('<p>explicitFileCount: '); | 1843 buffer.write('<p>explicitFileCount: '); |
| 1701 buffer.write(context['explicitFileCount']); | 1844 buffer.write(context['explicitFileCount']); |
| 1702 buffer.write('</p>'); | 1845 buffer.write('</p>'); |
| 1703 buffer.write('<p>implicitFileCount: '); | 1846 buffer.write('<p>implicitFileCount: '); |
| 1704 buffer.write(context['implicitFileCount']); | 1847 buffer.write(context['implicitFileCount']); |
| 1705 buffer.write('</p>'); | 1848 buffer.write('</p>'); |
| 1706 buffer.write('<p>workItemQueueLength: '); | 1849 buffer.write('<p>workItemQueueLength: '); |
| 1707 buffer.write(context['workItemQueueLength']); | 1850 buffer.write(context['workItemQueueLength']); |
| 1708 buffer.write('</p>'); | 1851 buffer.write('</p>'); |
| 1709 buffer.write('<p>workItemQueueLengthAverage: '); | 1852 |
| 1710 buffer.write(context['workItemQueueLengthAverage']); | 1853 AnalysisServer server = _server.analysisServer; |
| 1711 buffer.write('</p>'); | 1854 |
| 1855 if (server != null) { | |
| 1856 Folder folder = _findFolder(server, context['name']); | |
| 1857 InternalAnalysisContext ac = _server.analysisServer.folderMap[folder]; | |
| 1858 ElementCounter counter = new ElementCounter(); | |
| 1859 | |
| 1860 for (Source source in ac.librarySources) { | |
| 1861 LibraryElement libraryElement = ac.getLibraryElement(source); | |
| 1862 if (libraries.add(libraryElement)) { | |
| 1863 if (libraryElement != null) { | |
| 1864 if (libraryElement.isInSdk) { | |
| 1865 libraryElement.accept(sdkCounter); | |
| 1866 } else { | |
| 1867 libraryElement.accept(counter); | |
| 1868 } | |
| 1869 } | |
| 1870 } | |
| 1871 } | |
| 1872 buffer.write('<p>element count: '); | |
| 1873 buffer.write( | |
| 1874 counter.counts.values.fold(0, (prev, element) => prev + element)); | |
| 1875 buffer.write('</p>'); | |
| 1876 buffer.write('<p> (w/docs): '); | |
| 1877 buffer.write(counter.elementsWithDocs); | |
| 1878 buffer.write('</p>'); | |
| 1879 buffer.write('<p>total doc span: '); | |
| 1880 buffer.write(counter.totalDocSpan); | |
| 1881 buffer.write('</p>'); | |
| 1882 } | |
| 1712 } | 1883 } |
| 1884 | |
| 1885 buffer.write('<p><h3>'); | |
| 1886 buffer.write('SDK'); | |
| 1887 buffer.write('</h3></p>'); | |
| 1888 buffer.write('<p>element count: '); | |
| 1889 buffer.write( | |
| 1890 sdkCounter.counts.values.fold(0, (prev, element) => prev + element)); | |
| 1891 buffer.write('</p>'); | |
| 1892 buffer.write('<p> (w/docs): '); | |
| 1893 buffer.write(sdkCounter.elementsWithDocs); | |
| 1894 buffer.write('</p>'); | |
| 1895 buffer.write('<p>total doc span: '); | |
| 1896 buffer.write(sdkCounter.totalDocSpan); | |
| 1897 buffer.write('</p>'); | |
| 1713 } | 1898 } |
| 1714 | 1899 |
| 1715 /** | 1900 /** |
| 1716 * Write the status of the edit domain (on the main status page) to the given | 1901 * Write the status of the edit domain (on the main status page) to the given |
| 1717 * [buffer]. | 1902 * [buffer]. |
| 1718 */ | 1903 */ |
| 1719 void _writeEditStatus(StringBuffer buffer) { | 1904 void _writeEditStatus(StringBuffer buffer) { |
| 1720 buffer.write('<h3>Edit Domain</h3>'); | 1905 buffer.write('<h3>Edit Domain</h3>'); |
| 1721 _writeTwoColumns(buffer, (StringBuffer buffer) { | 1906 _writeTwoColumns(buffer, (StringBuffer buffer) { |
| 1722 buffer.write('<p><b>Performance Data</b></p>'); | 1907 buffer.write('<p><b>Performance Data</b></p>'); |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2214 */ | 2399 */ |
| 2215 static String makeLink( | 2400 static String makeLink( |
| 2216 String path, Map<String, String> params, String innerHtml, | 2401 String path, Map<String, String> params, String innerHtml, |
| 2217 [bool hasError = false]) { | 2402 [bool hasError = false]) { |
| 2218 Uri uri = new Uri(path: path, queryParameters: params); | 2403 Uri uri = new Uri(path: path, queryParameters: params); |
| 2219 String href = HTML_ESCAPE.convert(uri.toString()); | 2404 String href = HTML_ESCAPE.convert(uri.toString()); |
| 2220 String classAttribute = hasError ? ' class="error"' : ''; | 2405 String classAttribute = hasError ? ' class="error"' : ''; |
| 2221 return '<a href="$href"$classAttribute>$innerHtml</a>'; | 2406 return '<a href="$href"$classAttribute>$innerHtml</a>'; |
| 2222 } | 2407 } |
| 2223 } | 2408 } |
| OLD | NEW |