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

Side by Side Diff: pkg/analysis_server/lib/src/computers.dart

Issue 307963006: Implementation of 'notification.highlight' API. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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 computers;
6
7 import 'package:analyzer/src/generated/ast.dart';
8 import 'package:analyzer/src/generated/element.dart';
9 import 'package:analyzer/src/generated/scanner.dart';
10
11
12 /**
13 * A computer for [HighlightRegion]s in a Dart [CompilationUnit].
14 */
15 class DartUnitHighlightsComputer {
16 final CompilationUnit _unit;
17
18 final List<Map<String, Object>> _regions = <Map<String, Object>>[];
19
20 DartUnitHighlightsComputer(this._unit);
21
22 /**
23 * Returns the computed highlight regions, not `null`.
24 */
25 List<Map<String, Object>> compute() {
26 _unit.accept(new DartUnitHighlightsComputerVisitor(this));
27 return _regions;
28 }
29
30 void _addIdentifierRegion(SimpleIdentifier node) {
31 if (_addIdentifierRegion_keyword(node)) {
32 return;
33 }
34 if (_addIdentifierRegion_class(node)) {
35 return;
36 }
37 if (_addIdentifierRegion_constructor(node)) {
38 return;
39 }
40 if (_addIdentifierRegion_dynamicType(node)) {
41 return;
42 }
43 if (_addIdentifierRegion_getterSetterDeclaration(node)) {
44 return;
45 }
46 if (_addIdentifierRegion_field(node)) {
47 return;
48 }
49 if (_addIdentifierRegion_function(node)) {
50 return;
51 }
52 if (_addIdentifierRegion_functionTypeAlias(node)) {
53 return;
54 }
55 if (_addIdentifierRegion_importPrefix(node)) {
56 return;
57 }
58 if (_addIdentifierRegion_localVariable(node)) {
59 return;
60 }
61 if (_addIdentifierRegion_method(node)) {
62 return;
63 }
64 if (_addIdentifierRegion_parameter(node)) {
65 return;
66 }
67 if (_addIdentifierRegion_topLevelVariable(node)) {
68 return;
69 }
70 if (_addIdentifierRegion_typeParameter(node)) {
71 return;
72 }
73 _addRegion_node(node, HighlightType.IDENTIFIER_DEFAULT);
74 }
75
76 void _addIdentifierRegion_annotation(Annotation node) {
77 ArgumentList arguments = node.arguments;
78 if (arguments == null) {
79 _addRegion_node(node, HighlightType.ANNOTATION);
80 } else {
81 _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.AN NOTATION);
82 _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
83 }
84 }
85
86 bool _addIdentifierRegion_class(SimpleIdentifier node) {
87 Element element = node.staticElement;
88 if (element is! ClassElement) {
89 return false;
90 }
91 return _addRegion_node(node, HighlightType.CLASS);
92 }
93
94 bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
95 Element element = node.staticElement;
96 if (element is! ConstructorElement) {
97 return false;
98 }
99 return _addRegion_node(node, HighlightType.CONSTRUCTOR);
100 }
101
102 bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
103 // should be variable
104 Element element = node.staticElement;
105 if (element is! VariableElement) {
106 return false;
107 }
108 // has propagated type
109 if (node.propagatedType != null) {
110 return false;
111 }
112 // has dynamic static type
113 DartType staticType = node.staticType;
114 if (staticType == null || !staticType.isDynamic) {
115 return false;
116 }
117 // OK
118 return _addRegion_node(node, HighlightType.DYNAMIC_TYPE);
119 }
120
121 bool _addIdentifierRegion_field(SimpleIdentifier node) {
122 Element element = node.bestElement;
123 if (element is FieldFormalParameterElement) {
124 element = (element as FieldFormalParameterElement).field;
125 }
126 if (element is FieldElement) {
127 if ((element as FieldElement).isStatic) {
128 return _addRegion_node(node, HighlightType.FIELD_STATIC);
129 } else {
130 return _addRegion_node(node, HighlightType.FIELD);
131 }
132 }
133 if (element is PropertyAccessorElement) {
134 if ((element as PropertyAccessorElement).isStatic) {
135 return _addRegion_node(node, HighlightType.FIELD_STATIC);
136 } else {
137 return _addRegion_node(node, HighlightType.FIELD);
138 }
139 }
140 return false;
141 }
142
143 bool _addIdentifierRegion_function(SimpleIdentifier node) {
144 Element element = node.staticElement;
145 if (element is! FunctionElement) {
146 return false;
147 }
148 HighlightType type;
149 if (node.inDeclarationContext()) {
150 type = HighlightType.FUNCTION_DECLARATION;
151 } else {
152 type = HighlightType.FUNCTION;
153 }
154 return _addRegion_node(node, type);
155 }
156
157 bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
158 Element element = node.staticElement;
159 if (element is! FunctionTypeAliasElement) {
160 return false;
161 }
162 return _addRegion_node(node, HighlightType.FUNCTION_TYPE_ALIAS);
163 }
164
165 bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
166 // should be declaration
167 AstNode parent = node.parent;
168 if (!(parent is MethodDeclaration || parent is FunctionDeclaration)) {
169 return false;
170 }
171 // should be property accessor
172 Element element = node.staticElement;
173 if (element is! PropertyAccessorElement) {
174 return false;
175 }
176 // getter or setter
177 PropertyAccessorElement propertyAccessorElement = element as PropertyAccesso rElement;
178 if (propertyAccessorElement.isGetter) {
179 return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
180 } else {
181 return _addRegion_node(node, HighlightType.SETTER_DECLARATION);
182 }
183 }
184
185 bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
186 Element element = node.staticElement;
187 if (element is! PrefixElement) {
188 return false;
189 }
190 return _addRegion_node(node, HighlightType.IMPORT_PREFIX);
191 }
192
193 bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
194 String name = node.name;
195 if (name == "void") {
196 return _addRegion_node(node, HighlightType.KEYWORD);
197 }
198 return false;
199 }
200
201 bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
202 Element element = node.staticElement;
203 if (element is! LocalVariableElement) {
204 return false;
205 }
206 // OK
207 HighlightType type;
208 if (node.inDeclarationContext()) {
209 type = HighlightType.LOCAL_VARIABLE_DECLARATION;
210 } else {
211 type = HighlightType.LOCAL_VARIABLE;
212 }
213 return _addRegion_node(node, type);
214 }
215
216 bool _addIdentifierRegion_method(SimpleIdentifier node) {
217 Element element = node.bestElement;
218 if (element is! MethodElement) {
219 return false;
220 }
221 MethodElement methodElement = element as MethodElement;
222 bool isStatic = methodElement.isStatic;
223 // OK
224 HighlightType type;
225 if (node.inDeclarationContext()) {
226 if (isStatic) {
227 type = HighlightType.METHOD_DECLARATION_STATIC;
228 } else {
229 type = HighlightType.METHOD_DECLARATION;
230 }
231 } else {
232 if (isStatic) {
233 type = HighlightType.METHOD_STATIC;
234 } else {
235 type = HighlightType.METHOD;
236 }
237 }
238 return _addRegion_node(node, type);
239 }
240
241 bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
242 Element element = node.staticElement;
243 if (element is! ParameterElement) {
244 return false;
245 }
246 return _addRegion_node(node, HighlightType.PARAMETER);
247 }
248
249 bool _addIdentifierRegion_topLevelVariable(SimpleIdentifier node) {
250 Element element = node.staticElement;
251 if (element is! TopLevelVariableElement) {
252 return false;
253 }
254 return _addRegion_node(node, HighlightType.TOP_LEVEL_VARIABLE);
255 }
256
257 bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
258 Element element = node.staticElement;
259 if (element is! TypeParameterElement) {
260 return false;
261 }
262 return _addRegion_node(node, HighlightType.TYPE_PARAMETER);
263 }
264
265 void _addRegion(int offset, int length, HighlightType type) {
266 _regions.add({'offset': offset, 'length': length, 'type': type.name});
267 }
268
269 bool _addRegion_node(AstNode node, HighlightType type) {
270 int offset = node.offset;
271 int length = node.length;
272 _addRegion(offset, length, type);
273 return true;
274 }
275
276 void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightType type) {
277 int offset = a.offset;
278 int end = b.end;
279 _addRegion(offset, end - offset, type);
280 }
281
282 void _addRegion_token(Token token, HighlightType type) {
283 if (token != null) {
284 int offset = token.offset;
285 int length = token.length;
286 _addRegion(offset, length, type);
287 }
288 }
289
290 void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightType type) {
291 int offset = a.offset;
292 int end = b.end;
293 _addRegion(offset, end - offset, type);
294 }
295 }
296 class DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<Object> {
Brian Wilkerson 2014/05/30 13:58:05 Perhaps a blank line and a comment would help sepa
297 final DartUnitHighlightsComputer computer;
298
299 DartUnitHighlightsComputerVisitor(this.computer) : super();
300
301 @override
302 Object visitAnnotation(Annotation node) {
303 computer._addIdentifierRegion_annotation(node);
304 return super.visitAnnotation(node);
305 }
306
307 @override
308 Object visitAsExpression(AsExpression node) {
309 computer._addRegion_token(node.asOperator, HighlightType.BUILT_IN);
310 return super.visitAsExpression(node);
311 }
312
313 @override
314 Object visitBooleanLiteral(BooleanLiteral node) {
315 computer._addRegion_node(node, HighlightType.LITERAL_BOOLEAN);
316 return super.visitBooleanLiteral(node);
317 }
318
319 @override
320 Object visitCatchClause(CatchClause node) {
321 computer._addRegion_token(node.onKeyword, HighlightType.BUILT_IN);
322 return super.visitCatchClause(node);
323 }
324
325 @override
326 Object visitClassDeclaration(ClassDeclaration node) {
327 computer._addRegion_token(node.abstractKeyword, HighlightType.BUILT_IN);
328 return super.visitClassDeclaration(node);
329 }
330
331 @override
332 Object visitConstructorDeclaration(ConstructorDeclaration node) {
333 computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
334 computer._addRegion_token(node.factoryKeyword, HighlightType.BUILT_IN);
335 return super.visitConstructorDeclaration(node);
336 }
337
338 @override
339 Object visitDoubleLiteral(DoubleLiteral node) {
340 computer._addRegion_node(node, HighlightType.LITERAL_DOUBLE);
341 return super.visitDoubleLiteral(node);
342 }
343
344 @override
345 Object visitExportDirective(ExportDirective node) {
346 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
347 return super.visitExportDirective(node);
348 }
349
350 @override
351 Object visitFieldDeclaration(FieldDeclaration node) {
352 computer._addRegion_token(node.staticKeyword, HighlightType.BUILT_IN);
353 return super.visitFieldDeclaration(node);
354 }
355
356 @override
357 Object visitFunctionDeclaration(FunctionDeclaration node) {
358 computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
359 computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
360 return super.visitFunctionDeclaration(node);
361 }
362
363 @override
364 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
365 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
366 return super.visitFunctionTypeAlias(node);
367 }
368
369 @override
370 Object visitHideCombinator(HideCombinator node) {
371 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
372 return super.visitHideCombinator(node);
373 }
374
375 @override
376 Object visitImplementsClause(ImplementsClause node) {
377 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
378 return super.visitImplementsClause(node);
379 }
380
381 @override
382 Object visitImportDirective(ImportDirective node) {
383 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
384 computer._addRegion_token(node.deferredToken, HighlightType.BUILT_IN);
385 computer._addRegion_token(node.asToken, HighlightType.BUILT_IN);
386 return super.visitImportDirective(node);
387 }
388
389 @override
390 Object visitIntegerLiteral(IntegerLiteral node) {
391 computer._addRegion_node(node, HighlightType.LITERAL_INTEGER);
392 return super.visitIntegerLiteral(node);
393 }
394
395 @override
396 Object visitLibraryDirective(LibraryDirective node) {
397 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
398 return super.visitLibraryDirective(node);
399 }
400
401 @override
402 Object visitMethodDeclaration(MethodDeclaration node) {
403 computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
404 computer._addRegion_token(node.modifierKeyword, HighlightType.BUILT_IN);
405 computer._addRegion_token(node.operatorKeyword, HighlightType.BUILT_IN);
406 computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
407 return super.visitMethodDeclaration(node);
408 }
409
410 @override
411 Object visitNativeClause(NativeClause node) {
412 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
413 return super.visitNativeClause(node);
414 }
415
416 @override
417 Object visitNativeFunctionBody(NativeFunctionBody node) {
418 computer._addRegion_token(node.nativeToken, HighlightType.BUILT_IN);
419 return super.visitNativeFunctionBody(node);
420 }
421
422 @override
423 Object visitPartDirective(PartDirective node) {
424 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
425 return super.visitPartDirective(node);
426 }
427
428 @override
429 Object visitPartOfDirective(PartOfDirective node) {
430 computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, Highli ghtType.BUILT_IN);
431 return super.visitPartOfDirective(node);
432 }
433
434 @override
435 Object visitShowCombinator(ShowCombinator node) {
436 computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
437 return super.visitShowCombinator(node);
438 }
439
440 @override
441 Object visitSimpleIdentifier(SimpleIdentifier node) {
442 computer._addIdentifierRegion(node);
443 return super.visitSimpleIdentifier(node);
444 }
445
446 @override
447 Object visitSimpleStringLiteral(SimpleStringLiteral node) {
448 computer._addRegion_node(node, HighlightType.LITERAL_STRING);
449 return super.visitSimpleStringLiteral(node);
450 }
451
452 @override
453 Object visitTypeName(TypeName node) {
454 DartType type = node.type;
455 if (type != null) {
456 if (type.isDynamic && node.name.name == "dynamic") {
457 computer._addRegion_node(node, HighlightType.TYPE_NAME_DYNAMIC);
458 return null;
459 }
460 }
461 return super.visitTypeName(node);
462 }
463 }
464
465 /**
466 * Highlighting kinds constants.
467 */
468 class HighlightType {
469 static const HighlightType ANNOTATION = const HighlightType('ANNOTATION');
470 static const HighlightType BUILT_IN = const HighlightType('BUILT_IN');
471 static const HighlightType CLASS = const HighlightType('CLASS');
472 static const HighlightType COMMENT_BLOCK = const HighlightType('COMMENT_BLOCK' );
473 static const HighlightType COMMENT_DOCUMENTATION = const HighlightType('COMMEN T_DOCUMENTATION');
474 static const HighlightType COMMENT_END_OF_LINE = const HighlightType('COMMENT_ END_OF_LINE');
475 static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR');
476 static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE');
477 static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE');
478 static const HighlightType FIELD = const HighlightType('FIELD');
479 static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC');
480 static const HighlightType FUNCTION_DECLARATION = const HighlightType('FUNCTIO N_DECLARATION');
481 static const HighlightType FUNCTION = const HighlightType('FUNCTION');
482 static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType('FUNCTION _TYPE_ALIAS');
483 static const HighlightType GETTER_DECLARATION = const HighlightType('GETTER_DE CLARATION');
484 static const HighlightType KEYWORD = const HighlightType('KEYWORD');
485 static const HighlightType IDENTIFIER_DEFAULT = const HighlightType('IDENTIFIE R_DEFAULT');
486 static const HighlightType IMPORT_PREFIX = const HighlightType('IMPORT_PREFIX' );
487 static const HighlightType LITERAL_BOOLEAN = const HighlightType('LITERAL_BOOL EAN');
488 static const HighlightType LITERAL_DOUBLE = const HighlightType('LITERAL_DOUBL E');
489 static const HighlightType LITERAL_INTEGER = const HighlightType('LITERAL_INTE GER');
490 static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST');
491 static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP');
492 static const HighlightType LITERAL_STRING = const HighlightType('LITERAL_STRIN G');
493 static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType('L OCAL_VARIABLE_DECLARATION');
494 static const HighlightType LOCAL_VARIABLE = const HighlightType('LOCAL_VARIABL E');
495 static const HighlightType METHOD_DECLARATION = const HighlightType('METHOD_DE CLARATION');
496 static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType('ME THOD_DECLARATION_STATIC');
497 static const HighlightType METHOD = const HighlightType('METHOD');
498 static const HighlightType METHOD_STATIC = const HighlightType('METHOD_STATIC' );
499 static const HighlightType PARAMETER = const HighlightType('PARAMETER');
500 static const HighlightType SETTER_DECLARATION = const HighlightType('SETTER_DE CLARATION');
501 static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType('TOP_LEVEL _VARIABLE');
502 static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType('TYPE_NAME_ DYNAMIC');
503 static const HighlightType TYPE_PARAMETER = const HighlightType('TYPE_PARAMETE R');
504
505 final String name;
506
507 @override
508 String toString() => name;
509
510 const HighlightType(this.name);
511 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/test/domain_analysis_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698