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

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

Issue 364083002: Implemention of the 'analysis.overrides' notification. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
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.overrides;
6
7 import 'package:analysis_server/src/computer/element.dart';
8 import 'package:analysis_server/src/constants.dart';
9 import 'package:analyzer/src/generated/ast.dart';
10 import 'package:analyzer/src/generated/element.dart' as engine;
11
12
13 /**
14 * A computer for class member overrides in a Dart [CompilationUnit].
15 */
16 class DartUnitOverridesComputer {
17 final CompilationUnit _unit;
18
19 final List<Override> _overrides = <Override>[];
20 engine.ClassElement _currentClass;
21
22 DartUnitOverridesComputer(this._unit);
23
24 /**
25 * Returns the computed occurrences, not `null`.
26 */
27 List<Map<String, Object>> compute() {
28 for (CompilationUnitMember unitMember in _unit.declarations) {
29 if (unitMember is ClassDeclaration) {
30 _currentClass = unitMember.element;
31 for (ClassMember classMember in unitMember.members) {
32 if (classMember is MethodDeclaration) {
33 SimpleIdentifier nameNode = classMember.name;
34 _addOverride(nameNode.offset, nameNode.length, nameNode.name);
35 }
36 if (classMember is FieldDeclaration) {
37 List<VariableDeclaration> fields = classMember.fields.variables;
38 for (VariableDeclaration field in fields) {
39 SimpleIdentifier nameNode = field.name;
40 _addOverride(nameNode.offset, nameNode.length, nameNode.name);
41 }
42 }
43 }
44 }
45 }
46 return _overrides.map((override) => override.toJson()).toList();
47 }
48
49 void _addOverride(int offset, int length, String name) {
50 // super
51 engine.Element superEngineElement;
52 {
53 engine.InterfaceType superType = _currentClass.supertype;
54 if (superType != null) {
55 superEngineElement = _lookupMember(superType.element, name);
56 }
57 }
58 // interfaces
59 List<engine.Element> interfaceEngineElements = <engine.Element>[];
60 for (engine.InterfaceType interfaceType in _currentClass.interfaces) {
61 engine.ClassElement interfaceElement = interfaceType.element;
62 engine.Element interfaceMember = _lookupMember(interfaceElement, name);
63 if (interfaceMember != null) {
64 interfaceEngineElements.add(interfaceMember);
65 }
66 }
67 // is there any override?
68 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
69 Element superElement = superEngineElement != null ?
70 new Element.fromEngine(superEngineElement) : null;
71 List<Element> interfaceElements = interfaceEngineElements.map(
72 (engineElement) {
73 return new Element.fromEngine(engineElement);
74 }).toList();
75 _overrides.add(new Override(offset, length, superElement,
76 interfaceElements));
77 }
78 }
79
80 static engine.Element _lookupMember(engine.ClassElement classElement,
81 String name) {
82 if (classElement == null) {
83 return null;
84 }
85 engine.LibraryElement library = classElement.library;
86 // method
87 engine.Element member = classElement.lookUpMethod(name, library);
88 if (member != null) {
89 return member;
90 }
91 // getter
92 member = classElement.lookUpGetter(name, library);
93 if (member != null) {
94 return member;
95 }
96 // setter
97 member = classElement.lookUpSetter(name + '=', library);
98 if (member != null) {
99 return member;
100 }
101 // not found
102 return null;
103 }
104 }
105
106
107 class Override {
108 final int offset;
109 final int length;
110 final Element superclassElement;
111 final List<Element> interfaceElements;
112
113 Override(this.offset, this.length, this.superclassElement,
114 this.interfaceElements);
115
116 factory Override.fromJson(Map<String, Object> map) {
117 int offset = map[OFFSET];
118 int length = map[LENGTH];
119 // super
120 Element superclassElement = null;
121 {
122 Map<String, Object> superJson = map[SUPER_CLASS_ELEMENT];
123 if (superJson != null) {
124 superclassElement = new Element.fromJson(superJson);
125 }
126 }
127 // interfaces
128 List<Element> interfaceElements = null;
129 {
130 List<Map<String, Object>> jsonList = map[INTERFACE_ELEMENTS];
131 if (jsonList != null) {
132 interfaceElements = <Element>[];
133 for (Map<String, Object> json in jsonList) {
134 interfaceElements.add(new Element.fromJson(json));
135 }
136 }
137 }
138 // done
139 return new Override(offset, length, superclassElement, interfaceElements);
140 }
141
142 Map<String, Object> toJson() {
143 Map<String, Object> json = <String, Object>{};
144 json[OFFSET] = offset;
145 json[LENGTH] = length;
146 if (superclassElement != null) {
147 json[SUPER_CLASS_ELEMENT] = superclassElement.toJson();
148 }
149 if (interfaceElements != null && interfaceElements.isNotEmpty) {
150 json[INTERFACE_ELEMENTS] = interfaceElements.map((element) {
151 return element.toJson();
152 }).toList();
153 }
154 return json;
155 }
156
157 @override
158 String toString() => toJson().toString();
159 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/lib/src/constants.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698