OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library computer.highlights2; | 5 library computer.highlights2; |
6 | 6 |
7 import 'package:analysis_server/src/protocol.dart' hide Element; | 7 import 'package:analysis_server/src/protocol.dart' hide Element; |
8 import 'package:analyzer/src/generated/ast.dart'; | 8 import 'package:analyzer/src/generated/ast.dart'; |
9 import 'package:analyzer/src/generated/element.dart'; | 9 import 'package:analyzer/src/generated/element.dart'; |
10 import 'package:analyzer/src/generated/scanner.dart'; | 10 import 'package:analyzer/src/generated/scanner.dart'; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 } | 89 } |
90 if (_addIdentifierRegion_method(node)) { | 90 if (_addIdentifierRegion_method(node)) { |
91 return; | 91 return; |
92 } | 92 } |
93 if (_addIdentifierRegion_parameter(node)) { | 93 if (_addIdentifierRegion_parameter(node)) { |
94 return; | 94 return; |
95 } | 95 } |
96 if (_addIdentifierRegion_typeParameter(node)) { | 96 if (_addIdentifierRegion_typeParameter(node)) { |
97 return; | 97 return; |
98 } | 98 } |
| 99 if (_addIdentifierRegion_unresolvedInstanceMemberReference(node)) { |
| 100 return; |
| 101 } |
99 _addRegion_node(node, HighlightRegionType.IDENTIFIER_DEFAULT); | 102 _addRegion_node(node, HighlightRegionType.IDENTIFIER_DEFAULT); |
100 } | 103 } |
101 | 104 |
102 void _addIdentifierRegion_annotation(Annotation node) { | 105 void _addIdentifierRegion_annotation(Annotation node) { |
103 ArgumentList arguments = node.arguments; | 106 ArgumentList arguments = node.arguments; |
104 if (arguments == null) { | 107 if (arguments == null) { |
105 _addRegion_node(node, HighlightRegionType.ANNOTATION); | 108 _addRegion_node(node, HighlightRegionType.ANNOTATION); |
106 } else { | 109 } else { |
107 _addRegion_nodeStart_tokenEnd( | 110 _addRegion_nodeStart_tokenEnd( |
108 node, arguments.beginToken, HighlightRegionType.ANNOTATION); | 111 node, arguments.beginToken, HighlightRegionType.ANNOTATION); |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 } | 348 } |
346 | 349 |
347 bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) { | 350 bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) { |
348 Element element = node.staticElement; | 351 Element element = node.staticElement; |
349 if (element is! TypeParameterElement) { | 352 if (element is! TypeParameterElement) { |
350 return false; | 353 return false; |
351 } | 354 } |
352 return _addRegion_node(node, HighlightRegionType.TYPE_PARAMETER); | 355 return _addRegion_node(node, HighlightRegionType.TYPE_PARAMETER); |
353 } | 356 } |
354 | 357 |
| 358 bool _addIdentifierRegion_unresolvedInstanceMemberReference( |
| 359 SimpleIdentifier node) { |
| 360 // unresolved |
| 361 Element element = node.bestElement; |
| 362 if (element != null) { |
| 363 return false; |
| 364 } |
| 365 // invoke / get / set |
| 366 bool decorate = false; |
| 367 AstNode parent = node.parent; |
| 368 if (parent is MethodInvocation) { |
| 369 Expression target = parent.realTarget; |
| 370 if (parent.methodName == node && |
| 371 target != null && |
| 372 _isDynamicExpression(target)) { |
| 373 decorate = true; |
| 374 } |
| 375 } else if (node.inGetterContext() || node.inSetterContext()) { |
| 376 if (parent is PrefixedIdentifier) { |
| 377 decorate = parent.identifier == node; |
| 378 } else if (parent is PropertyAccess) { |
| 379 decorate = parent.propertyName == node; |
| 380 } |
| 381 } |
| 382 if (decorate) { |
| 383 _addRegion_node( |
| 384 node, HighlightRegionType.UNRESOLVED_INSTANCE_MEMBER_REFERENCE); |
| 385 return true; |
| 386 } |
| 387 return false; |
| 388 } |
| 389 |
355 void _addRegion(int offset, int length, HighlightRegionType type) { | 390 void _addRegion(int offset, int length, HighlightRegionType type) { |
356 _regions.add(new HighlightRegion(type, offset, length)); | 391 _regions.add(new HighlightRegion(type, offset, length)); |
357 } | 392 } |
358 | 393 |
359 bool _addRegion_node(AstNode node, HighlightRegionType type) { | 394 bool _addRegion_node(AstNode node, HighlightRegionType type) { |
360 int offset = node.offset; | 395 int offset = node.offset; |
361 int length = node.length; | 396 int length = node.length; |
362 _addRegion(offset, length, type); | 397 _addRegion(offset, length, type); |
363 return true; | 398 return true; |
364 } | 399 } |
(...skipping 12 matching lines...) Expand all Loading... |
377 _addRegion(offset, length, type); | 412 _addRegion(offset, length, type); |
378 } | 413 } |
379 } | 414 } |
380 | 415 |
381 void _addRegion_tokenStart_tokenEnd( | 416 void _addRegion_tokenStart_tokenEnd( |
382 Token a, Token b, HighlightRegionType type) { | 417 Token a, Token b, HighlightRegionType type) { |
383 int offset = a.offset; | 418 int offset = a.offset; |
384 int end = b.end; | 419 int end = b.end; |
385 _addRegion(offset, end - offset, type); | 420 _addRegion(offset, end - offset, type); |
386 } | 421 } |
| 422 |
| 423 static bool _isDynamicExpression(Expression e) { |
| 424 if (e is SimpleIdentifier && e.staticElement is PrefixElement) { |
| 425 return false; |
| 426 } |
| 427 return e.bestType.isDynamic; |
| 428 } |
387 } | 429 } |
388 | 430 |
389 /** | 431 /** |
390 * An AST visitor for [DartUnitHighlightsComputer2]. | 432 * An AST visitor for [DartUnitHighlightsComputer2]. |
391 */ | 433 */ |
392 class _DartUnitHighlightsComputerVisitor2 extends RecursiveAstVisitor<Object> { | 434 class _DartUnitHighlightsComputerVisitor2 extends RecursiveAstVisitor<Object> { |
393 final DartUnitHighlightsComputer2 computer; | 435 final DartUnitHighlightsComputer2 computer; |
394 | 436 |
395 _DartUnitHighlightsComputerVisitor2(this.computer); | 437 _DartUnitHighlightsComputerVisitor2(this.computer); |
396 | 438 |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 void _addRegions_functionBody(FunctionBody node) { | 809 void _addRegions_functionBody(FunctionBody node) { |
768 Token keyword = node.keyword; | 810 Token keyword = node.keyword; |
769 if (keyword != null) { | 811 if (keyword != null) { |
770 Token star = node.star; | 812 Token star = node.star; |
771 int offset = keyword.offset; | 813 int offset = keyword.offset; |
772 int end = star != null ? star.end : keyword.end; | 814 int end = star != null ? star.end : keyword.end; |
773 computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN); | 815 computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN); |
774 } | 816 } |
775 } | 817 } |
776 } | 818 } |
OLD | NEW |