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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>');
}
/**
« 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