Chromium Code Reviews| Index: pkg/analysis_server/lib/src/status/get_handler.dart |
| diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart |
| index acb0c18807afee740a8d1bf34e0ff95b62778388..360ad0d4a206b7825ce95da4f064d61f2c785800 100644 |
| --- a/pkg/analysis_server/lib/src/status/get_handler.dart |
| +++ b/pkg/analysis_server/lib/src/status/get_handler.dart |
| @@ -27,6 +27,7 @@ import 'package:analysis_server/src/status/element_writer.dart'; |
| import 'package:analysis_server/src/status/validator.dart'; |
| import 'package:analysis_server/src/utilities/average.dart'; |
| import 'package:analyzer/dart/element/element.dart'; |
| +import 'package:analyzer/dart/element/visitor.dart'; |
| import 'package:analyzer/file_system/file_system.dart'; |
| import 'package:analyzer/source/error_processor.dart'; |
| import 'package:analyzer/src/context/cache.dart'; |
| @@ -57,6 +58,141 @@ import 'package:plugin/plugin.dart'; |
| */ |
| typedef void HtmlGenerator(StringBuffer buffer); |
| +class ElementCounter extends RecursiveElementVisitor { |
| + Map<Type, int> counts = new HashMap<Type, int>(); |
| + int elementsWithDocs = 0; |
| + int totalDocSpan = 0; |
| + |
| + void visit(Element element) { |
| + 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
|
| + if (docRange != null) { |
| + ++elementsWithDocs; |
| + totalDocSpan += docRange.length; |
| + } |
| + |
| + Type type = element.runtimeType; |
| + if (counts[type] == null) { |
| + counts[type] = 1; |
| + } else { |
| + counts[type]++; |
| + } |
| + } |
| + |
| + @override |
| + visitClassElement(ClassElement element) { |
| + visit(element); |
| + super.visitClassElement(element); |
| + } |
| + |
| + @override |
| + visitCompilationUnitElement(CompilationUnitElement element) { |
| + visit(element); |
| + super.visitCompilationUnitElement(element); |
| + } |
| + |
| + @override |
| + visitConstructorElement(ConstructorElement element) { |
| + visit(element); |
| + super.visitConstructorElement(element); |
| + } |
| + |
| + @override |
| + visitExportElement(ExportElement element) { |
| + visit(element); |
| + super.visitExportElement(element); |
| + } |
| + |
| + @override |
| + visitFieldElement(FieldElement element) { |
| + visit(element); |
| + super.visitFieldElement(element); |
| + } |
| + |
| + @override |
| + visitFieldFormalParameterElement(FieldFormalParameterElement element) { |
| + visit(element); |
| + super.visitFieldFormalParameterElement(element); |
| + } |
| + |
| + @override |
| + visitFunctionElement(FunctionElement element) { |
| + visit(element); |
| + super.visitFunctionElement(element); |
| + } |
| + |
| + @override |
| + visitFunctionTypeAliasElement(FunctionTypeAliasElement element) { |
| + visit(element); |
| + super.visitFunctionTypeAliasElement(element); |
| + } |
| + |
| + @override |
| + visitImportElement(ImportElement element) { |
| + visit(element); |
| + super.visitImportElement(element); |
| + } |
| + |
| + @override |
| + visitLabelElement(LabelElement element) { |
| + visit(element); |
| + super.visitLabelElement(element); |
| + } |
| + |
| + @override |
| + visitLibraryElement(LibraryElement element) { |
| + visit(element); |
| + super.visitLibraryElement(element); |
| + } |
| + |
| + @override |
| + visitLocalVariableElement(LocalVariableElement element) { |
| + visit(element); |
| + super.visitLocalVariableElement(element); |
| + } |
| + |
| + @override |
| + visitMethodElement(MethodElement element) { |
| + visit(element); |
| + super.visitMethodElement(element); |
| + } |
| + |
| + @override |
| + visitMultiplyDefinedElement(MultiplyDefinedElement element) { |
| + visit(element); |
| + super.visitMultiplyDefinedElement(element); |
| + } |
| + |
| + @override |
| + visitParameterElement(ParameterElement element) { |
| + visit(element); |
| + super.visitParameterElement(element); |
| + } |
| + |
| + @override |
| + visitPrefixElement(PrefixElement element) { |
| + visit(element); |
| + super.visitPrefixElement(element); |
| + } |
| + |
| + @override |
| + visitPropertyAccessorElement(PropertyAccessorElement element) { |
| + visit(element); |
| + super.visitPropertyAccessorElement(element); |
| + } |
| + |
| + @override |
| + visitTopLevelVariableElement(TopLevelVariableElement element) { |
| + visit(element); |
| + super.visitTopLevelVariableElement(element); |
| + } |
| + |
| + @override |
| + visitTypeParameterElement(TypeParameterElement element) { |
| + visit(element); |
| + super.visitTypeParameterElement(element); |
| + } |
| +} |
| + |
| /** |
| * Instances of the class [GetHandler] handle GET requests. |
| */ |
| @@ -1693,6 +1829,13 @@ class GetHandler { |
| var json = response.toJson()[Response.RESULT]; |
| List contexts = json['contexts']; |
| contexts.sort((first, second) => first['name'].compareTo(second['name'])); |
| + |
| + // Track visited libraries. |
| + Set<LibraryElement> libraries = new HashSet<LibraryElement>(); |
| + |
| + // Count SDK elements separately. |
| + ElementCounter sdkCounter = new ElementCounter(); |
| + |
| for (var context in contexts) { |
| buffer.write('<p><h3>'); |
| buffer.write(context['name']); |
| @@ -1706,10 +1849,52 @@ class GetHandler { |
| buffer.write('<p>workItemQueueLength: '); |
| buffer.write(context['workItemQueueLength']); |
| buffer.write('</p>'); |
| - buffer.write('<p>workItemQueueLengthAverage: '); |
| - buffer.write(context['workItemQueueLengthAverage']); |
| - buffer.write('</p>'); |
| + |
| + AnalysisServer server = _server.analysisServer; |
| + |
| + if (server != null) { |
| + Folder folder = _findFolder(server, context['name']); |
| + InternalAnalysisContext ac = _server.analysisServer.folderMap[folder]; |
| + ElementCounter counter = new ElementCounter(); |
| + |
| + for (Source source in ac.librarySources) { |
| + LibraryElement libraryElement = ac.getLibraryElement(source); |
| + if (libraries.add(libraryElement)) { |
| + if (libraryElement != null) { |
| + if (libraryElement.isInSdk) { |
| + libraryElement.accept(sdkCounter); |
| + } else { |
| + libraryElement.accept(counter); |
| + } |
| + } |
| + } |
| + } |
| + buffer.write('<p>element count: '); |
| + buffer.write( |
| + counter.counts.values.fold(0, (prev, element) => prev + element)); |
| + buffer.write('</p>'); |
| + buffer.write('<p> (w/docs): '); |
| + buffer.write(counter.elementsWithDocs); |
| + buffer.write('</p>'); |
| + buffer.write('<p>total doc span: '); |
| + buffer.write(counter.totalDocSpan); |
| + buffer.write('</p>'); |
| + } |
| } |
| + |
| + buffer.write('<p><h3>'); |
| + buffer.write('SDK'); |
| + buffer.write('</h3></p>'); |
| + buffer.write('<p>element count: '); |
| + buffer.write( |
| + sdkCounter.counts.values.fold(0, (prev, element) => prev + element)); |
| + buffer.write('</p>'); |
| + buffer.write('<p> (w/docs): '); |
| + buffer.write(sdkCounter.elementsWithDocs); |
| + buffer.write('</p>'); |
| + buffer.write('<p>total doc span: '); |
| + buffer.write(sdkCounter.totalDocSpan); |
| + buffer.write('</p>'); |
| } |
| /** |