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

Side by Side Diff: pkg/analysis_server/lib/src/computer/computer_occurrences.dart

Issue 1337143002: Add OCCURRENCES_CONTRIBUTOR_EXTENSION_POINT_ID. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 months 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
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library computer.occurrences;
6
7 import 'dart:collection';
8
9 import 'package:analysis_server/src/protocol_server.dart' as protocol;
10 import 'package:analyzer/src/generated/ast.dart';
11 import 'package:analyzer/src/generated/element.dart';
12
13 /**
14 * A computer for elements occurrences in a Dart [CompilationUnit].
15 */
16 class DartUnitOccurrencesComputer {
17 final CompilationUnit _unit;
18
19 final Map<Element, List<int>> _elementsOffsets =
20 new HashMap<Element, List<int>>();
21
22 DartUnitOccurrencesComputer(this._unit);
23
24 /**
25 * Returns the computed occurrences, not `null`.
26 */
27 List<protocol.Occurrences> compute() {
28 _unit.accept(new _DartUnitOccurrencesComputerVisitor(this));
29 List<protocol.Occurrences> occurrences = <protocol.Occurrences>[];
30 _elementsOffsets.forEach((engineElement, offsets) {
31 var serverElement = protocol.newElement_fromEngine(engineElement);
32 var length = engineElement.displayName.length;
33 occurrences.add(new protocol.Occurrences(serverElement, offsets, length));
34 });
35 return occurrences;
36 }
37
38 void _addOccurrence(Element element, int offset) {
39 element = _canonicalizeElement(element);
40 if (element == null || element == DynamicElementImpl.instance) {
41 return;
42 }
43 List<int> offsets = _elementsOffsets[element];
44 if (offsets == null) {
45 offsets = <int>[];
46 _elementsOffsets[element] = offsets;
47 }
48 offsets.add(offset);
49 }
50
51 Element _canonicalizeElement(Element element) {
52 if (element is FieldFormalParameterElement) {
53 element = (element as FieldFormalParameterElement).field;
54 }
55 if (element is PropertyAccessorElement) {
56 element = (element as PropertyAccessorElement).variable;
57 }
58 if (element is Member) {
59 element = (element as Member).baseElement;
60 }
61 return element;
62 }
63 }
64
65 class _DartUnitOccurrencesComputerVisitor extends RecursiveAstVisitor {
66 final DartUnitOccurrencesComputer computer;
67
68 _DartUnitOccurrencesComputerVisitor(this.computer);
69
70 @override
71 visitSimpleIdentifier(SimpleIdentifier node) {
72 Element element = node.bestElement;
73 if (element != null) {
74 computer._addOccurrence(element, node.offset);
75 }
76 return super.visitSimpleIdentifier(node);
77 }
78 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698