Index: pkg/analysis_server/lib/src/computer/computer_occurrences.dart |
diff --git a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4e36665481caf32f8bccf713160ce7fe1ed298bc |
--- /dev/null |
+++ b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart |
@@ -0,0 +1,91 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library computer.occurrences; |
+ |
+import 'dart:collection'; |
+ |
+import 'package:analysis_server/src/computer/element.dart'; |
+import 'package:analysis_server/src/constants.dart'; |
+import 'package:analyzer/src/generated/ast.dart'; |
+import 'package:analyzer/src/generated/element.dart' as engine; |
+ |
+ |
+/** |
+ * A computer for elements occurrences in a Dart [CompilationUnit]. |
+ */ |
+class DartUnitOccurrencesComputer { |
+ final CompilationUnit _unit; |
+ |
+ final Map<engine.Element, List<int>> _elementsOffsets = |
+ new HashMap<engine.Element, List<int>>(); |
+ |
+ DartUnitOccurrencesComputer(this._unit); |
+ |
+ /** |
+ * Returns the computed occurrences, not `null`. |
+ */ |
+ List<Map<String, Object>> compute() { |
+ _unit.accept(new _DartUnitOccurrencesComputerVisitor(this)); |
+ List<Occurrences> occurrences = <Occurrences>[]; |
+ _elementsOffsets.forEach((engineElement, offsets) { |
+ Element serverElement = new Element.fromEngine(engineElement); |
+ int length = engineElement.displayName.length; |
+ occurrences.add(new Occurrences(serverElement, offsets, length)); |
+ }); |
+ return occurrences.map((occurrences) => occurrences.toJson()).toList(); |
+ } |
+ |
+ void _addOccurrence(engine.Element element, int offset) { |
+ List<int> offsets = _elementsOffsets[element]; |
+ if (offsets == null) { |
+ offsets = <int>[]; |
+ _elementsOffsets[element] = offsets; |
+ } |
+ offsets.add(offset); |
+ } |
+} |
+ |
+ |
+class Occurrences { |
+ final Element element; |
+ final List<int> offsets; |
+ final int length; |
+ |
+ Occurrences(this.element, this.offsets, this.length); |
+ |
+ factory Occurrences.fromJson(Map<String, Object> map) { |
+ Element element = new Element.fromJson(map[ELEMENT]); |
+ List<int> offsets = map[OFFSETS]; |
+ int length = map[LENGTH]; |
+ return new Occurrences(element, offsets, length); |
+ } |
+ |
+ Map<String, Object> toJson() { |
+ Map<String, Object> json = new HashMap<String, Object>(); |
+ json[ELEMENT] = element.toJson(); |
+ json[OFFSETS] = offsets; |
+ json[LENGTH] = length; |
+ return json; |
+ } |
+ |
+ @override |
+ String toString() => toJson().toString(); |
+} |
+ |
+ |
+class _DartUnitOccurrencesComputerVisitor extends RecursiveAstVisitor { |
+ final DartUnitOccurrencesComputer computer; |
+ |
+ _DartUnitOccurrencesComputerVisitor(this.computer); |
+ |
+ @override |
+ visitSimpleIdentifier(SimpleIdentifier node) { |
+ engine.Element element = node.bestElement; |
+ if (element != null) { |
+ computer._addOccurrence(element, node.offset); |
+ } |
+ return super.visitSimpleIdentifier(node); |
+ } |
+} |