Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Side by Side Diff: pkg/analysis_server/lib/src/status/get_handler.dart

Issue 1537503002: Status page diagnostics for elements and docs. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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>&nbsp;'); 1827 buffer.write(' (ms)</p>&nbsp;');
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698