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:collection'; | 7 import 'dart:collection'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'dart:math'; | 10 import 'dart:math'; |
| 11 | 11 |
| 12 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; | 12 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; |
| 13 import 'package:analysis_server/src/analysis_server.dart'; | 13 import 'package:analysis_server/src/analysis_server.dart'; |
| 14 import 'package:analysis_server/src/domain_completion.dart'; | 14 import 'package:analysis_server/src/domain_completion.dart'; |
| 15 import 'package:analysis_server/src/domain_diagnostic.dart'; | 15 import 'package:analysis_server/src/domain_diagnostic.dart'; |
| 16 import 'package:analysis_server/src/domain_execution.dart'; | 16 import 'package:analysis_server/src/domain_execution.dart'; |
| 17 import 'package:analysis_server/src/operation/operation.dart'; | 17 import 'package:analysis_server/src/operation/operation.dart'; |
| 18 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 18 import 'package:analysis_server/src/operation/operation_analysis.dart'; |
| 19 import 'package:analysis_server/src/operation/operation_queue.dart'; | 19 import 'package:analysis_server/src/operation/operation_queue.dart'; |
| 20 import 'package:analysis_server/src/services/completion/completion_performance.d art'; | 20 import 'package:analysis_server/src/services/completion/completion_performance.d art'; |
| 21 import 'package:analysis_server/src/socket_server.dart'; | 21 import 'package:analysis_server/src/socket_server.dart'; |
| 22 import 'package:analysis_server/src/status/ast_writer.dart'; | 22 import 'package:analysis_server/src/status/ast_writer.dart'; |
| 23 import 'package:analysis_server/src/status/element_writer.dart'; | 23 import 'package:analysis_server/src/status/element_writer.dart'; |
| 24 import 'package:analysis_server/src/status/memory_use.dart'; | |
| 24 import 'package:analysis_server/src/status/validator.dart'; | 25 import 'package:analysis_server/src/status/validator.dart'; |
| 25 import 'package:analysis_server/src/utilities/average.dart'; | 26 import 'package:analysis_server/src/utilities/average.dart'; |
| 26 import 'package:analyzer/dart/ast/ast.dart'; | 27 import 'package:analyzer/dart/ast/ast.dart'; |
| 27 import 'package:analyzer/dart/element/element.dart'; | 28 import 'package:analyzer/dart/element/element.dart'; |
| 28 import 'package:analyzer/dart/element/visitor.dart'; | 29 import 'package:analyzer/dart/element/visitor.dart'; |
| 29 import 'package:analyzer/file_system/file_system.dart'; | 30 import 'package:analyzer/file_system/file_system.dart'; |
| 30 import 'package:analyzer/source/embedder.dart'; | 31 import 'package:analyzer/source/embedder.dart'; |
| 31 import 'package:analyzer/source/error_processor.dart'; | 32 import 'package:analyzer/source/error_processor.dart'; |
| 32 import 'package:analyzer/source/sdk_ext.dart'; | 33 import 'package:analyzer/source/sdk_ext.dart'; |
| 33 import 'package:analyzer/src/context/cache.dart'; | 34 import 'package:analyzer/src/context/cache.dart'; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 * The path used to request diagnostic information. | 252 * The path used to request diagnostic information. |
| 252 */ | 253 */ |
| 253 static const String DIAGNOSTIC_PATH = '/diagnostic'; | 254 static const String DIAGNOSTIC_PATH = '/diagnostic'; |
| 254 | 255 |
| 255 /** | 256 /** |
| 256 * The path used to request information about a element model. | 257 * The path used to request information about a element model. |
| 257 */ | 258 */ |
| 258 static const String ELEMENT_PATH = '/element'; | 259 static const String ELEMENT_PATH = '/element'; |
| 259 | 260 |
| 260 /** | 261 /** |
| 262 * The path used to request an analysis of the memory use of the analyzer. | |
| 263 */ | |
| 264 static const String MEMORY_USE_PATH = '/memoryUse'; | |
| 265 | |
| 266 /** | |
| 261 * The path used to request an overlay contents. | 267 * The path used to request an overlay contents. |
| 262 */ | 268 */ |
| 263 static const String OVERLAY_PATH = '/overlay'; | 269 static const String OVERLAY_PATH = '/overlay'; |
| 264 | 270 |
| 265 /** | 271 /** |
| 266 * The path used to request overlays information. | 272 * The path used to request overlays information. |
| 267 */ | 273 */ |
| 268 static const String OVERLAYS_PATH = '/overlays'; | 274 static const String OVERLAYS_PATH = '/overlays'; |
| 269 | 275 |
| 270 /** | 276 /** |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 383 } else if (path == CONTEXT_DIAGNOSTICS_PATH) { | 389 } else if (path == CONTEXT_DIAGNOSTICS_PATH) { |
| 384 _returnContextDiagnostics(request); | 390 _returnContextDiagnostics(request); |
| 385 } else if (path == CONTEXT_VALIDATION_DIAGNOSTICS_PATH) { | 391 } else if (path == CONTEXT_VALIDATION_DIAGNOSTICS_PATH) { |
| 386 _returnContextValidationDiagnostics(request); | 392 _returnContextValidationDiagnostics(request); |
| 387 } else if (path == CONTEXT_PATH) { | 393 } else if (path == CONTEXT_PATH) { |
| 388 _returnContextInfo(request); | 394 _returnContextInfo(request); |
| 389 } else if (path == DIAGNOSTIC_PATH) { | 395 } else if (path == DIAGNOSTIC_PATH) { |
| 390 _returnDiagnosticInfo(request); | 396 _returnDiagnosticInfo(request); |
| 391 } else if (path == ELEMENT_PATH) { | 397 } else if (path == ELEMENT_PATH) { |
| 392 _returnElement(request); | 398 _returnElement(request); |
| 399 } else if (path == MEMORY_USE_PATH) { | |
| 400 _returnMemoryUsage(request); | |
| 393 } else if (path == OVERLAY_PATH) { | 401 } else if (path == OVERLAY_PATH) { |
| 394 _returnOverlayContents(request); | 402 _returnOverlayContents(request); |
| 395 } else if (path == OVERLAYS_PATH) { | 403 } else if (path == OVERLAYS_PATH) { |
| 396 _returnOverlaysInfo(request); | 404 _returnOverlaysInfo(request); |
| 397 } else { | 405 } else { |
| 398 _returnUnknownRequest(request); | 406 _returnUnknownRequest(request); |
| 399 } | 407 } |
| 400 } | 408 } |
| 401 | 409 |
| 402 /** | 410 /** |
| (...skipping 1234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1637 | 1645 |
| 1638 void _returnFailure(HttpRequest request, String message) { | 1646 void _returnFailure(HttpRequest request, String message) { |
| 1639 _writeResponse(request, (StringBuffer buffer) { | 1647 _writeResponse(request, (StringBuffer buffer) { |
| 1640 _writePage(buffer, 'Analysis Server - Failure', [], | 1648 _writePage(buffer, 'Analysis Server - Failure', [], |
| 1641 (StringBuffer buffer) { | 1649 (StringBuffer buffer) { |
| 1642 buffer.write(HTML_ESCAPE.convert(message)); | 1650 buffer.write(HTML_ESCAPE.convert(message)); |
| 1643 }); | 1651 }); |
| 1644 }); | 1652 }); |
| 1645 } | 1653 } |
| 1646 | 1654 |
| 1655 void _returnMemoryUsage(HttpRequest request) { | |
| 1656 _writeResponse(request, (StringBuffer buffer) { | |
| 1657 _writePage(buffer, 'Analysis Server - Memory Use', [], | |
| 1658 (StringBuffer buffer) { | |
| 1659 AnalysisServer server = _server.analysisServer; | |
| 1660 MemoryUseData data = new MemoryUseData(); | |
| 1661 data.processAnalysisServer(server); | |
| 1662 Map<Type, HashSet> instances = data.instances; | |
| 1663 List<Type> classNames = instances.keys.toList(); | |
|
scheglov
2016/07/11 15:27:49
These are not names, but types.
Just in case if th
Brian Wilkerson
2016/07/11 17:26:36
It was accidental, thanks. Done.
| |
| 1664 classNames.sort((Type left, Type right) => | |
| 1665 left.toString().compareTo(right.toString())); | |
| 1666 | |
| 1667 buffer.write('<h3>Instance Counts (reachable from contexts)</h3>'); | |
| 1668 buffer.write('<table>'); | |
| 1669 _writeRow(buffer, ['Count', 'Class name'], header: true); | |
| 1670 classNames.forEach((Type type) { | |
| 1671 _writeRow(buffer, [instances[type].length, type], | |
| 1672 classes: ['right', null]); | |
| 1673 }); | |
| 1674 buffer.write('</table>'); | |
| 1675 | |
| 1676 void writeCountMap(String title, Map<Type, int> counts) { | |
| 1677 List<Type> classNames = counts.keys.toList(); | |
| 1678 classNames.sort((Type left, Type right) => | |
| 1679 left.toString().compareTo(right.toString())); | |
| 1680 | |
| 1681 buffer.write('<h3>$title</h3>'); | |
| 1682 buffer.write('<table>'); | |
| 1683 _writeRow(buffer, ['Count', 'Class name'], header: true); | |
| 1684 classNames.forEach((Type type) { | |
| 1685 _writeRow(buffer, [counts[type], type], classes: ['right', null]); | |
| 1686 }); | |
| 1687 buffer.write('</table>'); | |
| 1688 } | |
| 1689 writeCountMap('Directly Held AST Nodes', data.directNodeCounts); | |
| 1690 writeCountMap('Indirectly Held AST Nodes', data.indirectNodeCounts); | |
| 1691 writeCountMap('Directly Held Elements', data.elementCounts); | |
| 1692 | |
| 1693 buffer.write('<h3>Other Data</h3>'); | |
| 1694 buffer.write('<p>'); | |
| 1695 buffer.write(data.uniqueTargetedResults.length); | |
| 1696 buffer.write(' non-equal TargetedResults</p>'); | |
| 1697 buffer.write('<p>'); | |
| 1698 buffer.write(data.uniqueLSUs.length); | |
| 1699 buffer.write(' non-equal LibrarySpecificUnits</p>'); | |
| 1700 }); | |
| 1701 }); | |
| 1702 } | |
| 1703 | |
| 1647 void _returnOverlayContents(HttpRequest request) { | 1704 void _returnOverlayContents(HttpRequest request) { |
| 1648 String path = request.requestedUri.queryParameters[PATH_PARAM]; | 1705 String path = request.requestedUri.queryParameters[PATH_PARAM]; |
| 1649 if (path == null) { | 1706 if (path == null) { |
| 1650 return _returnFailure(request, 'Query parameter $PATH_PARAM required'); | 1707 return _returnFailure(request, 'Query parameter $PATH_PARAM required'); |
| 1651 } | 1708 } |
| 1652 String contents = _overlayContents[path]; | 1709 String contents = _overlayContents[path]; |
| 1653 | 1710 |
| 1654 _writeResponse(request, (StringBuffer buffer) { | 1711 _writeResponse(request, (StringBuffer buffer) { |
| 1655 _writePage(buffer, 'Analysis Server - Overlay', [], | 1712 _writePage(buffer, 'Analysis Server - Overlay', [], |
| 1656 (StringBuffer buffer) { | 1713 (StringBuffer buffer) { |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2221 /** | 2278 /** |
| 2222 * Write to the given [buffer] a representation of the given [map] of strings | 2279 * Write to the given [buffer] a representation of the given [map] of strings |
| 2223 * to strings. | 2280 * to strings. |
| 2224 */ | 2281 */ |
| 2225 void _writeMapOfStringToString(StringBuffer buffer, Map<String, String> map) { | 2282 void _writeMapOfStringToString(StringBuffer buffer, Map<String, String> map) { |
| 2226 List<String> keys = map.keys.toList(); | 2283 List<String> keys = map.keys.toList(); |
| 2227 keys.sort(); | 2284 keys.sort(); |
| 2228 int length = keys.length; | 2285 int length = keys.length; |
| 2229 buffer.write('{'); | 2286 buffer.write('{'); |
| 2230 for (int i = 0; i < length; i++) { | 2287 for (int i = 0; i < length; i++) { |
| 2288 buffer.write('<br>'); | |
| 2231 String key = keys[i]; | 2289 String key = keys[i]; |
| 2232 if (i > 0) { | 2290 if (i > 0) { |
| 2233 buffer.write(', '); | 2291 buffer.write(', '); |
| 2234 } | 2292 } |
| 2235 buffer.write(key); | 2293 buffer.write(key); |
| 2236 buffer.write(' = '); | 2294 buffer.write(' = '); |
| 2237 buffer.write(map[key]); | 2295 buffer.write(map[key]); |
| 2238 } | 2296 } |
| 2239 buffer.write('}'); | 2297 buffer.write('<br>}'); |
| 2240 } | 2298 } |
| 2241 | 2299 |
| 2242 /** | 2300 /** |
| 2243 * Write a representation of an analysis option with the given [name] and | 2301 * Write a representation of an analysis option with the given [name] and |
| 2244 * [value] to the given [buffer]. The option should be separated from other | 2302 * [value] to the given [buffer]. The option should be separated from other |
| 2245 * options unless the [last] flag is true, indicating that this is the last | 2303 * options unless the [last] flag is true, indicating that this is the last |
| 2246 * option in the list of options. | 2304 * option in the list of options. |
| 2247 */ | 2305 */ |
| 2248 void _writeOption(StringBuffer buffer, String name, Object value, | 2306 void _writeOption(StringBuffer buffer, String name, Object value, |
| 2249 {bool last: false}) { | 2307 {bool last: false}) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2282 buffer.write( | 2340 buffer.write( |
| 2283 'h3 {background-color: #DDDDDD; margin-top: 0em; margin-bottom: 0em;}'); | 2341 'h3 {background-color: #DDDDDD; margin-top: 0em; margin-bottom: 0em;}'); |
| 2284 buffer.write('p {margin-top: 0.5em; margin-bottom: 0.5em;}'); | 2342 buffer.write('p {margin-top: 0.5em; margin-bottom: 0.5em;}'); |
| 2285 buffer.write( | 2343 buffer.write( |
| 2286 'p.commentary {margin-top: 1em; margin-bottom: 1em; margin-left: 2em; fo nt-style: italic;}'); | 2344 'p.commentary {margin-top: 1em; margin-bottom: 1em; margin-left: 2em; fo nt-style: italic;}'); |
| 2287 // response.write('span.error {text-decoration-line: underline; text-decorati on-color: red; text-decoration-style: wavy;}'); | 2345 // response.write('span.error {text-decoration-line: underline; text-decorati on-color: red; text-decoration-style: wavy;}'); |
| 2288 buffer.write( | 2346 buffer.write( |
| 2289 'table.column {border: 0px solid black; width: 100%; table-layout: fixed ;}'); | 2347 'table.column {border: 0px solid black; width: 100%; table-layout: fixed ;}'); |
| 2290 buffer.write('td.column {vertical-align: top; width: 50%;}'); | 2348 buffer.write('td.column {vertical-align: top; width: 50%;}'); |
| 2291 buffer.write('td.right {text-align: right;}'); | 2349 buffer.write('td.right {text-align: right;}'); |
| 2350 buffer.write('th {text-align: left;}'); | |
| 2292 buffer.write('</style>'); | 2351 buffer.write('</style>'); |
| 2293 buffer.write('</head>'); | 2352 buffer.write('</head>'); |
| 2294 | 2353 |
| 2295 buffer.write('<body>'); | 2354 buffer.write('<body>'); |
| 2296 buffer.write( | 2355 buffer.write( |
| 2297 '<h2>$title <small><small>(as of $time on $date)</small></small></h2>'); | 2356 '<h2>$title <small><small>(as of $time on $date)</small></small></h2>'); |
| 2298 if (subtitles != null && subtitles.isNotEmpty) { | 2357 if (subtitles != null && subtitles.isNotEmpty) { |
| 2299 buffer.write('<blockquote>'); | 2358 buffer.write('<blockquote>'); |
| 2300 bool first = true; | 2359 bool first = true; |
| 2301 for (String subtitle in subtitles) { | 2360 for (String subtitle in subtitles) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2440 buffer.write('</p>'); | 2499 buffer.write('</p>'); |
| 2441 | 2500 |
| 2442 buffer.write('<p><b>Performance Data</b></p>'); | 2501 buffer.write('<p><b>Performance Data</b></p>'); |
| 2443 buffer.write('<p>'); | 2502 buffer.write('<p>'); |
| 2444 buffer.write(makeLink( | 2503 buffer.write(makeLink( |
| 2445 COMMUNICATION_PERFORMANCE_PATH, {}, 'Communication performance')); | 2504 COMMUNICATION_PERFORMANCE_PATH, {}, 'Communication performance')); |
| 2446 buffer.write('</p>'); | 2505 buffer.write('</p>'); |
| 2447 buffer.write('<p>'); | 2506 buffer.write('<p>'); |
| 2448 buffer.write(makeLink(DIAGNOSTIC_PATH, {}, 'General diagnostics')); | 2507 buffer.write(makeLink(DIAGNOSTIC_PATH, {}, 'General diagnostics')); |
| 2449 buffer.write('</p>'); | 2508 buffer.write('</p>'); |
| 2509 buffer.write('<p>'); | |
| 2510 buffer.write(makeLink(MEMORY_USE_PATH, {}, 'Memory usage')); | |
| 2511 buffer.write(' <small>(long running)</small></p>'); | |
| 2450 }, (StringBuffer buffer) { | 2512 }, (StringBuffer buffer) { |
| 2451 _writeSubscriptionList(buffer, ServerService.VALUES, services); | 2513 _writeSubscriptionList(buffer, ServerService.VALUES, services); |
| 2452 }); | 2514 }); |
| 2453 return analysisServer != null; | 2515 return analysisServer != null; |
| 2454 } | 2516 } |
| 2455 | 2517 |
| 2456 /** | 2518 /** |
| 2457 * Write a representation of the given [stackTrace] to the given [buffer]. | 2519 * Write a representation of the given [stackTrace] to the given [buffer]. |
| 2458 */ | 2520 */ |
| 2459 void _writeStackTrace(StringBuffer buffer, StackTrace stackTrace) { | 2521 void _writeStackTrace(StringBuffer buffer, StackTrace stackTrace) { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2647 */ | 2709 */ |
| 2648 static String makeLink( | 2710 static String makeLink( |
| 2649 String path, Map<String, String> params, String innerHtml, | 2711 String path, Map<String, String> params, String innerHtml, |
| 2650 [bool hasError = false]) { | 2712 [bool hasError = false]) { |
| 2651 Uri uri = new Uri(path: path, queryParameters: params); | 2713 Uri uri = new Uri(path: path, queryParameters: params); |
| 2652 String href = HTML_ESCAPE.convert(uri.toString()); | 2714 String href = HTML_ESCAPE.convert(uri.toString()); |
| 2653 String classAttribute = hasError ? ' class="error"' : ''; | 2715 String classAttribute = hasError ? ' class="error"' : ''; |
| 2654 return '<a href="$href"$classAttribute>$innerHtml</a>'; | 2716 return '<a href="$href"$classAttribute>$innerHtml</a>'; |
| 2655 } | 2717 } |
| 2656 } | 2718 } |
| OLD | NEW |