| 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 services.src.correction.util; | 5 library services.src.correction.util; |
| 6 | 6 |
| 7 import 'dart:math'; | 7 import 'dart:math'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/protocol.dart' | 9 import 'package:analysis_server/src/protocol.dart' |
| 10 show SourceChange, SourceEdit; | 10 show SourceChange, SourceEdit; |
| 11 import 'package:analysis_server/src/protocol_server.dart' | 11 import 'package:analysis_server/src/protocol_server.dart' |
| 12 show doSourceChange_addElementEdit; | 12 show doSourceChange_addElementEdit; |
| 13 import 'package:analysis_server/src/services/correction/source_range.dart'; | 13 import 'package:analysis_server/src/services/correction/source_range.dart'; |
| 14 import 'package:analysis_server/src/services/correction/strings.dart'; | 14 import 'package:analysis_server/src/services/correction/strings.dart'; |
| 15 import 'package:analysis_server/src/services/search/element_visitors.dart'; |
| 15 import 'package:analyzer/src/generated/ast.dart'; | 16 import 'package:analyzer/src/generated/ast.dart'; |
| 16 import 'package:analyzer/src/generated/element.dart'; | 17 import 'package:analyzer/src/generated/element.dart'; |
| 17 import 'package:analyzer/src/generated/engine.dart'; | 18 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/resolver.dart'; | 19 import 'package:analyzer/src/generated/resolver.dart'; |
| 19 import 'package:analyzer/src/generated/scanner.dart'; | 20 import 'package:analyzer/src/generated/scanner.dart'; |
| 20 import 'package:analyzer/src/generated/source.dart'; | 21 import 'package:analyzer/src/generated/source.dart'; |
| 21 import 'package:path/path.dart'; | 22 import 'package:path/path.dart'; |
| 22 | 23 |
| 23 /** | 24 /** |
| 24 * Adds edits to the given [change] that ensure that all the [libraries] are | 25 * Adds edits to the given [change] that ensure that all the [libraries] are |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 return new SourceEdit(range.offset, range.length, newSource); | 590 return new SourceEdit(range.offset, range.length, newSource); |
| 590 } | 591 } |
| 591 | 592 |
| 592 /** | 593 /** |
| 593 * Returns the [AstNode] that encloses the given offset. | 594 * Returns the [AstNode] that encloses the given offset. |
| 594 */ | 595 */ |
| 595 AstNode findNode(int offset) => | 596 AstNode findNode(int offset) => |
| 596 new NodeLocator.con1(offset).searchWithin(unit); | 597 new NodeLocator.con1(offset).searchWithin(unit); |
| 597 | 598 |
| 598 /** | 599 /** |
| 600 * Returns names of elements that might conflict with a new local variable |
| 601 * declared at [offset]. |
| 602 */ |
| 603 Set<String> findPossibleLocalVariableConflicts(int offset) { |
| 604 Set<String> conflicts = new Set<String>(); |
| 605 AstNode enclosingNode = findNode(offset); |
| 606 Block enclosingBlock = enclosingNode.getAncestor((node) => node is Block); |
| 607 if (enclosingBlock != null) { |
| 608 SourceRange newRange = rangeStartEnd(offset, enclosingBlock.end); |
| 609 ExecutableElement enclosingExecutable = |
| 610 getEnclosingExecutableElement(enclosingNode); |
| 611 if (enclosingExecutable != null) { |
| 612 visitChildren(enclosingExecutable, (Element element) { |
| 613 if (element is LocalElement) { |
| 614 SourceRange elementRange = element.visibleRange; |
| 615 if (elementRange != null && elementRange.intersects(newRange)) { |
| 616 conflicts.add(element.displayName); |
| 617 } |
| 618 } |
| 619 return true; |
| 620 }); |
| 621 } |
| 622 } |
| 623 return conflicts; |
| 624 } |
| 625 |
| 626 /** |
| 599 * Returns the actual type source of the given [Expression], may be `null` | 627 * Returns the actual type source of the given [Expression], may be `null` |
| 600 * if can not be resolved, should be treated as the `dynamic` type. | 628 * if can not be resolved, should be treated as the `dynamic` type. |
| 601 */ | 629 */ |
| 602 String getExpressionTypeSource( | 630 String getExpressionTypeSource( |
| 603 Expression expression, Set<LibraryElement> librariesToImport) { | 631 Expression expression, Set<LibraryElement> librariesToImport) { |
| 604 if (expression == null) { | 632 if (expression == null) { |
| 605 return null; | 633 return null; |
| 606 } | 634 } |
| 607 DartType type = expression.bestType; | 635 DartType type = expression.bestType; |
| 608 if (type.isDynamic) { | 636 if (type.isDynamic) { |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1473 | 1501 |
| 1474 @override | 1502 @override |
| 1475 Object visitExpression(Expression node) { | 1503 Object visitExpression(Expression node) { |
| 1476 if (node is BinaryExpression && node.operator.type == groupOperatorType) { | 1504 if (node is BinaryExpression && node.operator.type == groupOperatorType) { |
| 1477 return super.visitNode(node); | 1505 return super.visitNode(node); |
| 1478 } | 1506 } |
| 1479 operands.add(node); | 1507 operands.add(node); |
| 1480 return null; | 1508 return null; |
| 1481 } | 1509 } |
| 1482 } | 1510 } |
| OLD | NEW |