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 |